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..c20c7607 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,1001 +1,164 @@ # 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) +## Unreleased Changes +## [7.0.0-alpha.2][7.0.0-alpha.2] (February 19, 2021) * Fixed incorrect protocol version between the client and server. [7.0.0-alpha.2]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-alpha.2 -## [7.0.0-alpha.1] (February 18, 2021) - +## [7.0.0-alpha.1][7.0.0-alpha.1] (February 18, 2021) This release includes a brand new implementation of the Roblox DOM. It brings performance improvements, much better support for `rbxl` and `rbxm` files, and a better internal API. * Added support for all remaining property types. * Added support for the entire Roblox binary model format. * Changed `rojo upload` to upload binary places and models instead of XML. - * This should make using `rojo upload` much more feasible for large places. + * This should make using `rojo upload` much more feasible for large places. * **Breaking**: Changed format of some types of values in `project.json`, `model.json`, and `meta.json` files. - * This should impact few projects. See [this file][allValues.json] for new examples of each property type. + * This should impact few projects. See [this file][allValues.json] for new examples of each property type. Formatting of types will change more before the stable release of Rojo 7. We're hoping to use this opportunity to normalize some of the case inconsistency introduced in Rojo 0.5. [7.0.0-alpha.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-alpha.1 [allValues.json]: https://github.com/rojo-rbx/rojo/blob/f4a790eb50b74e482000bad1dcfe22533992fb20/plugin/rbx_dom_lua/src/allValues.json -## [6.0.2] (February 9, 2021) - +## [6.0.2](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.2) (February 9, 2021) * Fixed `rojo upload` to handle CSRF challenges. -[6.0.2]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.2 - -## [6.0.1] (January 22, 2021) - +## [6.0.1](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.1) (January 22, 2021) * Fixed `rojo upload` requests being rejected by Roblox -[6.0.1]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.1 - -## [6.0.0] (January 16, 2021) - +## [6.0.0](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0) (January 16, 2021) * Improved server error messages - * The server will now keep running in more error cases + * The server will now keep running in more error cases * Fixed Rojo being unable to diff ClassName changes -[6.0.0]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0 - -## [6.0.0-rc.4] (December 14, 2020) - -* Added brand new Rojo UI ([#367]) +## [6.0.0 Release Candidate 4](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.4) (December 14, 2020) +* Added brand new Rojo UI ([#367](https://github.com/rojo-rbx/rojo/pull/367)) * Added `projectName` to `/api/rojo` output. -[6.0.0-rc.4]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.4 -[#367]: https://github.com/rojo-rbx/rojo/pull/367 - -## [6.0.0-rc.3] (November 19, 2020) - +## [6.0.0 Release Candidate 3](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.3) (November 19, 2020) * Fixed the Rojo plugin attempting to write the non-scriptable properties `Instance.SourceAssetId` and `HttpServer.HttpEnabled`. * Fixed the Rojo plugin's handling of null referents. -[6.0.0-rc.3]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.3 - -## [6.0.0-rc.2] (November 19, 2020) - -* Fixed crash when malformed CSV files are put into a project. ([#310]) -* Fixed incorrect string escaping when producing Lua code from JSON files. ([#314]) -* Fixed performance issues introduced in Rojo 6.0.0-rc.1. ([#317]) -* Fixed `rojo plugin install` subcommand failing for everyone except Rojo developers. ([#320]) -* Updated default place template to take advantage of [#210]. +## [6.0.0 Release Candidate 2](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.2) (November 19, 2020) +* Fixed crash when malformed CSV files are put into a project. ([#310](https://github.com/rojo-rbx/rojo/issues/310)) +* Fixed incorrect string escaping when producing Lua code from JSON files. ([#314](https://github.com/rojo-rbx/rojo/issues/314)) +* Fixed performance issues introduced in Rojo 6.0.0-rc.1. ([#317](https://github.com/rojo-rbx/rojo/issues/317)) +* Fixed `rojo plugin install` subcommand failing for everyone except Rojo developers. ([#320](https://github.com/rojo-rbx/rojo/issues/320)) +* Updated default place template to take advantage of [#210](https://github.com/rojo-rbx/rojo/pull/210). * Enabled glob ignore patterns by default and removed the `unstable_glob_ignore` feature. - * `globIgnorePaths` can be set on a project to a list of globs to ignore. + * `globIgnorePaths` can be set on a project to a list of globs to ignore. * The Rojo plugin now completes as much as it can from a patch without disconnecting. Warnings are shown in the console. * Fixed 6.0.0-rc.1 regression causing instances that changed ClassName to instead... not change ClassName. -[6.0.0-rc.2]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.2 -[#210]: https://github.com/rojo-rbx/rojo/pull/210 -[#310]: https://github.com/rojo-rbx/rojo/issues/310 -[#314]: https://github.com/rojo-rbx/rojo/issues/314 -[#317]: https://github.com/rojo-rbx/rojo/issues/317 -[#320]: https://github.com/rojo-rbx/rojo/issues/320 - -## [6.0.0-rc.1] (March 29, 2020) - +## [6.0.0 Release Candidate 1](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.1) (March 29, 2020) This release jumped from 0.6.0 to 6.0.0. Rojo has been in use in production for many users for quite a long times, and so 6.0 is a more accurate reflection of Rojo's version than a pre-1.0 version. * Added basic settings panel to plugin, with two settings: - * "Open Scripts Externally": When enabled, opening a script in Studio will instead open it in your default text editor. - * "Two-Way Sync": When enabled, Rojo will attempt to save changes to your place back to the filesystem. **Very early feature, very broken, beware!** + * "Open Scripts Externally": When enabled, opening a script in Studio will instead open it in your default text editor. + * "Two-Way Sync": When enabled, Rojo will attempt to save changes to your place back to the filesystem. **Very early feature, very broken, beware!** * Added `--color` option to force-enable or force-disable color in Rojo's output. -* Added support for turning `.json` files into `ModuleScript` instances ([#308]) -* Added `rojo plugin install` and `rojo plugin uninstall` to allow Rojo to manage its Roblox Studio plugin. ([#304]) -* Class names no longer need to be specified for Roblox services in Rojo projects. ([#210]) +* Added support for turning `.json` files into `ModuleScript` instances ([#308](https://github.com/rojo-rbx/rojo/pull/308)) +* Added `rojo plugin install` and `rojo plugin uninstall` to allow Rojo to manage its Roblox Studio plugin. ([#304](https://github.com/rojo-rbx/rojo/pull/304)) +* Class names no longer need to be specified for Roblox services in Rojo projects. ([#210](https://github.com/rojo-rbx/rojo/pull/210)) * The server half of **experimental** two-way sync is now enabled by default. * Increased default logging verbosity in commands like `rojo build`. * Rojo now requires a project file again, just like 0.5.4. -[6.0.0-rc.1]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.1 -[#304]: https://github.com/rojo-rbx/rojo/pull/304 -[#308]: https://github.com/rojo-rbx/rojo/pull/308 - -## [0.6.0-alpha.3] (March 13, 2020) - -* Added `--watch` argument to `rojo build`. ([#284]) -* Added dark theme support to plugin. ([#241]) +## [0.6.0 Alpha 3](https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.3) (March 13, 2020) +* Added `--watch` argument to `rojo build`. ([#284](https://github.com/rojo-rbx/rojo/pull/284)) +* Added dark theme support to plugin. ([#241](https://github.com/rojo-rbx/rojo/issues/241)) * Added a revamped `rojo init` command, which will now create more complete projects. * Added the `rojo doc` command, which opens Rojo's documentation in your browser. * Fixed many crashes from malformed projects and filesystem edge cases in `rojo serve`. * Simplified filesystem access code dramatically. * Improved error reporting and logging across the board. - * Log messages have a less noisy prefix. - * Any thread panicking now causes Rojo to abort instead of existing as a zombie. - * Errors now have a list of causes, helping make many errors more clear. - -[0.6.0-alpha.3]: https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.3 -[#241]: https://github.com/rojo-rbx/rojo/issues/241 -[#284]: https://github.com/rojo-rbx/rojo/pull/284 - -## [0.6.0-alpha.2] (March 6, 2020) + * Log messages have a less noisy prefix. + * Any thread panicking now causes Rojo to abort instead of existing as a zombie. + * Errors now have a list of causes, helping make many errors more clear. +## [0.6.0 Alpha 2](https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.2) (March 6, 2020) * Fixed `rojo upload` command always uploading models. * Removed `--kind` parameter to `rojo upload`; Rojo now automatically uploads the correct kind of asset based on your project file. -[0.6.0-alpha.2]: https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.2 - -## [0.5.4] (February 26, 2020) - +## [0.5.4](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.4) (February 26, 2020) This is a general maintenance release for the Rojo 0.5.x release series. * Updated reflection database and other dependencies. * First stable release with binaries for macOS and Linux. -[0.5.4]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.4 - -## [0.6.0-alpha.1] (January 22, 2020) +## [0.6.0 Alpha 1](https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.1) (January 22, 2020) ### General - -* Added support for nested project files. ([#95]) -* Added project file hot-reloading. ([#10]) -* Fixed Rojo dropping Ref properties ([#142]) - * This means that properties like `PrimaryPart` now work! +* Added support for nested project files. ([#95](https://github.com/rojo-rbx/rojo/issues/95)) +* Added project file hot-reloading. ([#10](https://github.com/rojo-rbx/rojo/issues/10)]) +* Fixed Rojo dropping Ref properties ([#142](https://github.com/rojo-rbx/rojo/issues/142)) + * This means that properties like `PrimaryPart` now work! * Improved live sync protocol to reduce round-trips and improve syncing consistency. * Improved support for binary model files and places. ### Command Line - * Added `--verbose`/`-v` flag, which can be specified multiple times to increase verbosity. * Added support for automatically finding Roblox Studio's auth cookie for `rojo upload` on Windows. * Added support for building, serving and uploading sources that aren't Rojo projects. * Improved feedback from `rojo serve`. * Removed support for legacy `roblox-project.json` projects, deprecated in an early Rojo 0.5.0 alpha. * Rojo no longer traverses directories upwards looking for project files. - * Though undocumented, Rojo 0.5.x will search for a project file contained in any ancestor folders. This feature was removed to better support other 0.6.x features. + * Though undocumented, Rojo 0.5.x will search for a project file contained in any ancestor folders. This feature was removed to better support other 0.6.x features. ### Roblox Studio Plugin - * Added "connecting" state to improve experience when live syncing. * Added "error" state to show errors in a place that isn't the output panel. * Improved diagnostics for when the Rojo plugin cannot create an instance. -[0.6.0-alpha.1]: https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.1 -[#10]: https://github.com/rojo-rbx/rojo/issues/10 -[#95]: https://github.com/rojo-rbx/rojo/issues/95 -[#142]: https://github.com/rojo-rbx/rojo/issues/142 - -## [0.5.3] (October 15, 2019) - +## [0.5.3](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.3) (October 15, 2019) * Fixed an issue where Rojo would throw an error when encountering recently-added instance classes. -[0.5.3]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.3 +## [0.5.2](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.2) (October 14, 2019) +* Fixed an issue where `LocalizationTable` instances would have their column order randomized. ([#173](https://github.com/rojo-rbx/rojo/issues/173)) -## [0.5.2] (October 14, 2019) - -* Fixed an issue where `LocalizationTable` instances would have their column order randomized. ([#173]) - -[0.5.2]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.2 -[#173]: https://github.com/rojo-rbx/rojo/issues/173 - -## [0.5.1] (October 4, 2019) - -* Fixed an issue where Rojo would drop changes if they happened too quickly ([#252]) +## [0.5.1](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.1) (October 4, 2019) +* Fixed an issue where Rojo would drop changes if they happened too quickly ([#252](https://github.com/rojo-rbx/rojo/issues/252)) * Improved diagnostics for when the Rojo plugin cannot create an instance. * Updated dependencies - * This brings Rojo's reflection database from client release 395 to client release 404. - -[0.5.1]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.1 -[#252]: https://github.com/rojo-rbx/rojo/issues/252 - -## [0.5.0] (August 27, 2019) + * This brings Rojo's reflection database from client release 395 to client release 404. +## [0.5.0](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0) (August 27, 2019) * Changed `.model.json` naming, which may require projects to migrate ambiguous cases: - * The file name now takes precedence over the `Name` field in the model, like Rojo 0.4.x. - * The `Name` field of the top-level instance is now optional. It's recommended that you remove it from your models. - * Rojo will emit a warning when `Name` is specified and does not match the name from the file. -* Fixed `Rect` values being set to `0, 0, 0, 0` when synced with the Rojo plugin. ([#201]) + * The file name now takes precedence over the `Name` field in the model, like Rojo 0.4.x. + * The `Name` field of the top-level instance is now optional. It's recommended that you remove it from your models. + * Rojo will emit a warning when `Name` is specified and does not match the name from the file. +* Fixed `Rect` values being set to `0, 0, 0, 0` when synced with the Rojo plugin. ([#201](https://github.com/rojo-rbx/rojo/issues/201)) * Fixed live-syncing of `PhysicalProperties`, `NumberSequence`, and `ColorSequence` values -[0.5.0]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0 -[#201]: https://github.com/rojo-rbx/rojo/issues/201 - -## [0.5.0-alpha.13] (August 2, 2019) - +## [0.5.0 Alpha 13](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.13) (August 2, 2019) * Bumped minimum Rust version to 1.34.0. -* Fixed default port documentation in `rojo serve --help` ([#219]) +* Fixed default port documentation in `rojo serve --help` ([#219](https://github.com/rojo-rbx/rojo/issues/219)) * Fixed BrickColor support by upgrading Roblox-related dependencies -[0.5.0-alpha.13]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.13 -[#219]: https://github.com/rojo-rbx/rojo/issues/219 - -## [0.5.0-alpha.12] (July 2, 2019) - +## [0.5.0 Alpha 12](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.12) (July 2, 2019) * Added `.meta.json` files - * `init.meta.json` files replace `init.model.json` files from Rojo 0.4.x ([#183]) - * Other `.meta.json` files allow attaching extra data to other files ([#189]) + * `init.meta.json` files replace `init.model.json` files from Rojo 0.4.x ([#183](https://github.com/rojo-rbx/rojo/pull/183)) + * Other `.meta.json` files allow attaching extra data to other files ([#189](https://github.com/rojo-rbx/rojo/pull/189)) * Added support for infinite and NaN values in types like `Vector2` when building models and places. - * These types aren't supported for live-syncing yet due to limitations around JSON encoding. + * These types aren't supported for live-syncing yet due to limitations around JSON encoding. * Added support for using `SharedString` values when building XML models and places. * Added support for live-syncing `CollectionService` tags. * Added a warning when building binary place files, since they're still experimental and have bugs. * Added a warning when trying to use Rojo 0.5.x with a Rojo 0.4.x-only project. -* Added a warning when a Rojo project contains keys that start with `$`, which are reserved names. ([#191]) +* Added a warning when a Rojo project contains keys that start with `$`, which are reserved names. ([#191](https://github.com/rojo-rbx/rojo/issues/191)) * Rojo now throws an error if unknown keys are found most files. * Added an icon to the plugin's toolbar button * Changed the plugin to use a docking widget for all UI. * Changed the plugin to ignore unknown properties when live-syncing. - * Rojo's approach to this problem might change later, like with a strict model mode ([#190]) or another approach. + * Rojo's approach to this problem might change later, like with a strict model mode ([#190](https://github.com/rojo-rbx/rojo/issues/190)) or another approach. * Upgraded to reflection database from client release 388. * Updated Rojo's branding to shift the color palette to make it work better on dark backgrounds -[0.5.0-alpha.12]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.12 -[#183]: https://github.com/rojo-rbx/rojo/pull/183 -[#189]: https://github.com/rojo-rbx/rojo/pull/189 -[#190]: https://github.com/rojo-rbx/rojo/issues/190 -[#191]: https://github.com/rojo-rbx/rojo/issues/191 - -## [0.5.0-alpha.11] (May 29, 2019) - -* Added support for implicit property values in JSON model files ([#154]) -* `Content` properties can now be specified in projects and model files as regular string literals. +## [0.5.0 Alpha 11](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.11) (May 29, 2019) +* Added support for implicit property values in JSON model files ([#154](https://github.com/rojo-rbx/rojo/pull/154)) +* `Content` propertyes can now be specified in projects and model files as regular string literals. * Added support for `BrickColor` properties. * Added support for properties added in client release 384, like `Lighting.Technology` being set to `"ShadowMap"`. * Improved performance when working with XML models and places @@ -1004,332 +167,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..de61ecf1 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. Publish the Plugin + * `rojo publish plugin --asset_id 6415005344` + * `rojo build plugin -o Rojo.rbxm` +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..e4e925af 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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" 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.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1" [[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,128 @@ 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.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" 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" +name = "blake3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "46080006c1505f12f64dd2a09264b343381ed3190fa02c8005d5d662ac571c63" dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if 0.1.10", + "constant_time_eq", + "crypto-mac", + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d" +dependencies = [ + "lazy_static", "memchr", "regex-automata", "serde", @@ -163,39 +186,47 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "099e596ef14349721d9016f6b80dd3419ea1bf289ab9b44df8e4dfd3a005d5d9" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" -version = "1.5.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" [[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 +236,92 @@ 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.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +checksum = "7cc80946b3480f421c2f17ed1cb841753a371c7c5104f51d507e13f532c856aa" dependencies = [ "encode_unicode", + "lazy_static", "libc", - "once_cell", - "windows-sys 0.59.0", + "terminal_size", + "winapi 0.3.9", ] [[package]] -name = "constant_time_eq" -version = "0.3.1" +name = "const_fn" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" + +[[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,31 +329,31 @@ 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.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" +checksum = "ab327ed7354547cc2ef43cbe20ef68b988e70b4b593cbd66a2a61733123a3d23" dependencies = [ "atty", "cast", - "clap 2.34.0", + "clap", "criterion-plot", "csv", - "itertools", + "itertools 0.10.0", "lazy_static", "num-traits", "oorandom", @@ -330,99 +370,173 @@ 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", + "itertools 0.9.0", ] [[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 = [ + "autocfg 1.0.1", + "cfg-if 1.0.0", + "lazy_static", +] + +[[package]] +name = "crypto-mac" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" dependencies = [ "generic-array", - "typenum", + "subtle", ] [[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.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "e8f45d9ad417bcef4817d614a501ab55cdd96a6fdb24f49aab89a54acfd66b19" +dependencies = [ + "quote 1.0.9", + "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 +546,52 @@ 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 = "dtoa" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.2", - "windows-sys 0.61.2", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +checksum = "88d7ed2934d741c6b37e33e3832298e8850b53fd2d2bea03873375596c7cea4e" [[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.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" 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 +601,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.9", + "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.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "1d34cfa13a63ae058bfa601fe9e313bbdb3746427c1459185464ce0fcf62e1e8" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 1.0.0", "libc", - "libredox", - "windows-sys 0.60.2", + "redox_syscall 0.2.5", + "winapi 0.3.9", ] [[package]] -name = "find-msvc-tools" -version = "0.1.5" +name = "flate2" +version = "1.0.20" 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 = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" dependencies = [ - "num-traits", + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide", ] [[package]] @@ -587,28 +668,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 +704,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 +717,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 +741,118 @@ 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.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 1.0.0", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.3.4" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 1.0.0", "libc", - "r-efi", - "wasip2", + "wasi 0.10.2+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.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" +checksum = "62aca2aba2d62b4a7f5b33f3712cb1b0692779a56fb510499d5c0aa594daeaf3" [[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.2" 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 = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" 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 +861,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 +872,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.5" 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 = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691" [[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "de910d521f7cc3135c4de8db1cb910e0b5ed1dc6f57c381cd07e8e661ce10094" dependencies = [ - "icu_normalizer", - "icu_properties", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "indexmap" -version = "1.9.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" 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,7 +978,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" dependencies = [ - "bitflags 1.3.2", + "bitflags", "inotify-sys", "libc", ] @@ -1125,16 +994,19 @@ dependencies = [ [[package]] name = "insta" -version = "1.44.1" +version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8732d3774162a0851e3f2b150eb98f31a9885dd75985099421d393385a01dfd" +checksum = "fd354a2c8c8083d58414597a4ecada1984f9b82ea7e87eeabddc869eaf120992" dependencies = [ "console", - "once_cell", + "lazy_static", "pest", "pest_derive", "serde", + "serde_json", + "serde_yaml", "similar", + "uuid 0.8.2", ] [[package]] @@ -1147,35 +1019,28 @@ dependencies = [ ] [[package]] -name = "ipnet" -version = "2.11.0" +name = "itertools" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] [[package]] name = "itertools" -version = "0.10.5" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.15" +version = "0.4.7" 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 = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "jod-thread" @@ -1185,23 +1050,13 @@ checksum = "8b23360e99b8717f20aaa4598f5a6541efbe30630039fbc7706cf954a87947ae" [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "5cfb73131c35423a367daf8cbd24100af0d077668c8c2943f0e7dd775fef0f65" 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 +1069,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 +1081,52 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.86" 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 = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" [[package]] name = "linked-hash-map" -version = "0.5.6" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[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.14" 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 = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 1.0.4", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", + "cfg-if 1.0.0", ] [[package]] -name = "lz4_flex" -version = "0.13.1" +name = "lz4" +version = "1.23.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 +1136,75 @@ 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 = "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 +1226,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 +1234,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 +1262,28 @@ dependencies = [ ] [[package]] -name = "net2" -version = "0.2.39" +name = "native-tls" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +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 +1292,187 @@ 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.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] +checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" [[package]] name = "once_cell" -version = "1.21.3" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" [[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.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "038d43985d1ddca7a9900630d8cd031b56e4794eecc2e9ea39dd17aa04399a70" +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.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921fc71883267538946025deffb622905ecad223c28efbfdef9bb59a0175f3e6" +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", + "redox_syscall 0.1.57", + "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,50 +1480,39 @@ 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.9", + "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.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +checksum = "45ca0ae5f169d0917a7c7f5a9c1a3d3d9598f18f529dd2b8373ed988efea307a" dependencies = [ "num-traits", "plotters-backend", @@ -1615,45 +1523,35 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.7" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" +checksum = "b07fffcddc1cb3a1de753caa4e4df03b79922ba43cf882acc1bdd7e8df9f4590" [[package]] name = "plotters-svg" -version = "0.3.7" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +checksum = "b38a02e23bd9604b842a812063aec4ef702b57989c37b655254bb61c471ad211" 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 +1561,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.9", + "syn", "version_check", ] @@ -1675,16 +1573,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", + "proc-macro2 1.0.24", + "quote 1.0.9", "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" @@ -1698,37 +1596,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.1", + "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,118 +1638,266 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.42" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" 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 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc 0.2.0", +] + +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.0", + "rand_core 0.6.2", + "rand_hc 0.3.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_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[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 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.2", +] + +[[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_hc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core 0.6.2", +] + +[[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.6.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f57d390e10fc236919088e9d973774bf006dcab137b443d1341a39317ebee4a" +checksum = "a373d7c1a7fc55234871452cbc7c3b584171d8eac5e5d1e541231167fdd55955" dependencies = [ - "ahash", "log", - "lz4_flex", - "profiling", + "lz4", "rbx_dom_weak", "rbx_reflection", "rbx_reflection_database", - "serde", - "thiserror 1.0.69", - "zstd", + "thiserror", ] [[package]] name = "rbx_dom_weak" -version = "4.2.0" +version = "2.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63614f84aae649ff71ef6e693d4fc9e2184c6ef55852d48a29685ebd0470114f" +checksum = "5ffa16d4ae69867cbe305d740790900193147ce5a904fc583f88dbfc7de43a95" dependencies = [ - "ahash", "rbx_types", "serde", - "ustr", ] [[package]] name = "rbx_reflection" -version = "7.0.0" +version = "4.0.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f53e5c4cf136060f7c514bd4d6f02436a57e36754c544965a7840123bc662d7" +checksum = "7c43632d239190aad5b9406a6f0df2233ae3b46489957dd6d11c4d6daa9046c5" dependencies = [ "rbx_types", "serde", - "thiserror 1.0.69", ] [[package]] name = "rbx_reflection_database" -version = "3.0.1+roblox-741" +version = "0.1.0+roblox-465" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d54d92786425d3fd3e4ba8f006b17d83f5e93dad6eb4fccf6f1d9d86222a7b" +checksum = "bcc9eca1c8c2016cb7237c290a298799fdef45f30782e088d3c625945b0f273c" dependencies = [ - "dirs 6.0.0", - "log", + "lazy_static", "rbx_reflection", "rmp-serde", "serde", @@ -1860,27 +1905,25 @@ dependencies = [ [[package]] name = "rbx_types" -version = "3.1.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3b89eefdd71f5e2a25543b1ead9f6ea2ed3fdfba8b397cbdb0de053eb2463e" +checksum = "4094f41f16e2a79cb7760bd64ac6f9d7bfe704accb6261dbff4c8fc58dd10c8c" dependencies = [ - "base64 0.13.1", - "bitflags 1.3.2", + "base64 0.11.0", + "bitflags", "blake3", "lazy_static", - "rand", + "rand 0.7.3", "serde", - "thiserror 1.0.69", ] [[package]] name = "rbx_xml" -version = "3.0.1" +version = "0.12.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df4dba3154bef50fe1ba41cf06a066b9cd33bcfbf1c103e8db0818d8b4528b31" +checksum = "37056d7a92f127dca0856ef850bf2627e440d37f4d1564b67ce1e0400925c89c" dependencies = [ - "ahash", - "base64 0.13.1", + "base64 0.11.0", "log", "rbx_dom_weak", "rbx_reflection", @@ -1888,119 +1931,109 @@ dependencies = [ "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" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" dependencies = [ - "bitflags 2.10.0", + "bitflags", ] [[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 0.1.16", + "redox_syscall 0.1.57", + "rust-argon2", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" 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.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" [[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,21 +2061,33 @@ 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 = [ + "bitflags", + "bstr", + "cc", + "libc", + "num-traits", +] + +[[package]] +name = "rmp" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f55e5fa1446c4d5dd1f5daeed2a4fe193071771a2636274d0d7a3b082aa7ad6" dependencies = [ "byteorder", "num-traits", - "paste", ] [[package]] name = "rmp-serde" -version = "1.3.0" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +checksum = "4ce7d70c926fe472aed493b902010bccc17fa9f7284145cb8772fd22fdb052d8" dependencies = [ "byteorder", "rmp", @@ -2051,77 +2096,62 @@ dependencies = [ [[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 = "7.0.0-alpha.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.2", "walkdir", - "winreg 0.10.1", - "yaml-rust2", + "winreg", ] [[package]] @@ -2133,75 +2163,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 +2205,156 @@ 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.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" 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.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", + "proc-macro2 1.0.24", + "quote 1.0.9", + "syn", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "ea1c6153794552ea7cf7cf63b1231a25de00ec90db326ba6264440fa08e31486" dependencies = [ "itoa", - "memchr", "ryu", "serde", - "serde_core", ] [[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.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +checksum = "15654ed4ab61726bf918a39cb8d98a2e2995b002387807fa6ba58fdf7f59bb23" 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" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +checksum = "9a04629d2e8ecdcf30e0188e3699ed6d50d5750d0219db146a790065fe92a897" [[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.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" +dependencies = [ + "maybe-uninit", +] [[package]] name = "snax" @@ -2392,140 +2366,106 @@ 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.9", + "syn", ] +[[package]] +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" + [[package]] name = "syn" -version = "1.0.109" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "unicode-ident", + "proc-macro2 1.0.24", + "quote 1.0.9", + "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.9", + "syn", + "unicode-xid 0.2.1", ] [[package]] name = "tempfile" -version = "3.23.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "fastrand", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", + "cfg-if 1.0.0", + "libc", + "rand 0.8.3", + "redox_syscall 0.2.5", + "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.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ca8ced750734db02076f44132d802af0b33b09942331f4459dde8636fd2406" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -2535,281 +2475,328 @@ 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.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" 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.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" 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.9", + "syn", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" dependencies = [ - "cfg-if 1.0.4", + "once_cell", ] [[package]] -name = "tinystr" -version = "0.8.2" +name = "time" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ - "displaydoc", - "zerovec", + "libc", + "winapi 0.3.9", ] [[package]] name = "tinytemplate" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +checksum = "a2ada8616fad06a2d0c455adc530de4ef57605a8120cc65da9653e0e9623ca74" dependencies = [ "serde", "serde_json", ] +[[package]] +name = "tinyvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +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 +2805,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.1", + "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.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.2", + "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.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" 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.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc45447f0d4573f3d65720f636bbcc3dd6ce920ed704670118650bcd47764c7" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2 1.0.24", + "quote 1.0.9", + "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.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "3b8853882eef39593ad4174dd26fc9865a64e84026d223f63bb2c42affcbba2c" dependencies = [ - "quote 1.0.42", + "quote 1.0.9", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "4133b5e7f2a531fa413b3a1695e925038a05a71cf67e87dafa295cb645a01385" dependencies = [ - "bumpalo", - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", + "proc-macro2 1.0.24", + "quote 1.0.9", + "syn", + "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" -dependencies = [ - "unicode-ident", -] +checksum = "dd4945e4943ae02d15c13962b38a5b1e81eadd4b71214eee75af64a4d6a4fd64" [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "c40dc691fc48003eba817c38da7113c15698142da971298003cac3ef175680b3" 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 +2998,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 +3011,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 +3020,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,20 +3030,11 @@ dependencies = [ "winapi-build", ] -[[package]] -name = "xml" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "636f85e5ca6488e96401b61eb7de54f4e44755c988af0f52cf90230c312a1a89" - [[package]] name = "xml-rs" -version = "1.0.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a56132a0d6ecbe77352edc10232f788fc4ceefefff4cab784a98e0e16b6b51" -dependencies = [ - "xml", -] +checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" [[package]] name = "yaml-rust" @@ -3476,145 +3044,3 @@ checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" dependencies = [ "linked-hash-map", ] - -[[package]] -name = "yaml-rust2" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" -dependencies = [ - "arraydeque", - "encoding_rs", - "hashlink", -] - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/Cargo.toml b/Cargo.toml index 9d37c22a..60b2c982 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 = "7.0.0-alpha.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,89 @@ 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_binary = { path = "../rbx-dom/rbx_binary" } # rbx_dom_weak = { path = "../rbx-dom/rbx_dom_weak" } # rbx_reflection = { path = "../rbx-dom/rbx_reflection" } # rbx_reflection_database = { path = "../rbx-dom/rbx_reflection_database" } # rbx_xml = { path = "../rbx-dom/rbx_xml" } -rbx_binary = { version = "3.0.1", features = ["unstable_text_format"] } -rbx_dom_weak = "4.2.0" -rbx_reflection = "7.0.0" -rbx_reflection_database = "3.0.1" -rbx_xml = "3.0.1" +rbx_binary = "0.6.0-alpha.1" +rbx_dom_weak = "2.0.0-alpha.1" +rbx_reflection = "4.0.0-alpha.1" +rbx_reflection_database = "0.1.0" +rbx_xml = "0.12.0-alpha.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" +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/run-tests.lua b/plugin/rbx_dom_lua/run-tests.lua new file mode 100644 index 00000000..c61bdc85 --- /dev/null +++ b/plugin/rbx_dom_lua/run-tests.lua @@ -0,0 +1 @@ +require(game.ReplicatedStorage.TestEZ).TestBootstrap:run({game.ReplicatedStorage.RbxDom}) \ No newline at end of file diff --git a/plugin/rbx_dom_lua/src/EncodedValue.lua b/plugin/rbx_dom_lua/src/EncodedValue.lua new file mode 100644 index 00000000..317f34f0 --- /dev/null +++ b/plugin/rbx_dom_lua/src/EncodedValue.lua @@ -0,0 +1,456 @@ +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 types +types = { + 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 + + 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 = 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, + }, + + 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, + }, + + Int32 = { + fromPod = identity, + toPod = identity, + }, + + Int64 = { + fromPod = identity, + toPod = identity, + }, + + 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 + keypoints[index] = NumberSequenceKeypoint.new( + keypoint.Time, + keypoint.Value, + keypoint.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 + return PhysicalProperties.new( + pod.Density, + pod.Friction, + pod.Elasticity, + pod.FrictionWeight, + pod.ElasticityWeight + ) + 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, + } + 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(_pod) + error("Ref cannot be decoded on its own") + end, + + toPod = function(_roblox) + error("Ref can not be encoded on its own") + end, + }, + + Region3 = { + fromPod = function(pod) + error("Region3 is not implemented") + end, + + toPod = function(roblox) + error("Region3 is not implemented") + end, + }, + + Region3int16 = { + fromPod = function(pod) + return Region3int16.new( + types.Vector3int16.fromPod(pod[1]), + types.Vector3int16.fromPod(pod[2]) + ) + 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, + }, + + 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, + }, +} + +local EncodedValue = {} + +function EncodedValue.decode(encodedValue) + local typeImpl = types[encodedValue.Type] + if typeImpl == nil then + return false, "Couldn't decode value " .. tostring(encodedValue.Type) + end + + return true, typeImpl.fromPod(encodedValue.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, { + Type = propertyType, + Value = typeImpl.toPod(rbxValue), + } +end + +return EncodedValue 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..cf0b2201 --- /dev/null +++ b/plugin/rbx_dom_lua/src/EncodedValue.spec.lua @@ -0,0 +1,72 @@ +return function() + local HttpService = game:GetService("HttpService") + + local EncodedValue = require(script.Parent.EncodedValue) + local allValues = require(script.Parent.allValues) + + local function deepEq(a, b) + if typeof(a) ~= typeof(b) then + return false + end + + local ty = typeof(a) + + if ty == "table" then + local visited = {} + + for key, valueA in pairs(a) do + visited[key] = true + + if not deepEq(valueA, b[key]) then + return false + end + end + + for key, valueB in pairs(b) do + if visited[key] then + continue + end + + if not deepEq(valueB, a[key]) then + return false + end + end + + return true + else + return a == b + end + end + + local extraAssertions = { + CFrame = function(value) + expect(value).to.equal(CFrame.new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) + end, + } + + for testName, testEntry in pairs(allValues) do + it("round trip " .. testName, function() + local ok, decoded = EncodedValue.decode(testEntry.value) + assert(ok, decoded) + + if extraAssertions[testName] ~= nil then + extraAssertions[testName](decoded) + end + + local ok, encoded = EncodedValue.encode(decoded, testEntry.ty) + assert(ok, encoded) + + if not deepEq(encoded, testEntry.value) then + local expected = HttpService:JSONEncode(testEntry.value) + local actual = HttpService:JSONEncode(encoded) + + local message = string.format( + "Round-trip results did not match.\nExpected:\n%s\nActual:\n%s", + expected, actual + ) + + error(message) + end + end) + end +end diff --git a/plugin/rbx_dom_lua/Error.lua b/plugin/rbx_dom_lua/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 74% rename from plugin/rbx_dom_lua/PropertyDescriptor.lua rename to plugin/rbx_dom_lua/src/PropertyDescriptor.lua index 1e34e851..dcb53632 100644 --- a/plugin/rbx_dom_lua/PropertyDescriptor.lua +++ b/plugin/rbx_dom_lua/src/PropertyDescriptor.lua @@ -20,21 +20,7 @@ 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, className = className, name = propertyName, @@ -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/allValues.json b/plugin/rbx_dom_lua/src/allValues.json new file mode 100644 index 00000000..c7df28c4 --- /dev/null +++ b/plugin/rbx_dom_lua/src/allValues.json @@ -0,0 +1,345 @@ +{ + "Axes": { + "value": { + "Type": "Axes", + "Value": [ + "X", + "Y", + "Z" + ] + }, + "ty": "Axes" + }, + "BinaryString": { + "value": { + "Type": "BinaryString", + "Value": "SGVsbG8h" + }, + "ty": "BinaryString" + }, + "Bool": { + "value": { + "Type": "Bool", + "Value": true + }, + "ty": "Bool" + }, + "BrickColor": { + "value": { + "Type": "BrickColor", + "Value": 1004 + }, + "ty": "BrickColor" + }, + "CFrame": { + "value": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Color3", + "Value": [ + 1.0, + 2.0, + 3.0 + ] + }, + "ty": "Color3" + }, + "Color3uint8": { + "value": { + "Type": "Color3uint8", + "Value": [ + 0, + 128, + 255 + ] + }, + "ty": "Color3uint8" + }, + "ColorSequence": { + "value": { + "Type": "ColorSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Color": [ + 1.0, + 1.0, + 0.5 + ] + }, + { + "Time": 1.0, + "Color": [ + 0.0, + 0.0, + 0.0 + ] + } + ] + } + }, + "ty": "ColorSequence" + }, + "Content": { + "value": { + "Type": "Content", + "Value": "rbxassetid://12345" + }, + "ty": "Content" + }, + "Enum": { + "value": { + "Type": "Enum", + "Value": 1234 + }, + "ty": "Enum" + }, + "Faces": { + "value": { + "Type": "Faces", + "Value": [ + "Right", + "Top", + "Back", + "Left", + "Bottom", + "Front" + ] + }, + "ty": "Faces" + }, + "Float32": { + "value": { + "Type": "Float32", + "Value": 15.0 + }, + "ty": "Float32" + }, + "Float64": { + "value": { + "Type": "Float64", + "Value": 15123.0 + }, + "ty": "Float64" + }, + "Int32": { + "value": { + "Type": "Int32", + "Value": 6014 + }, + "ty": "Int32" + }, + "Int64": { + "value": { + "Type": "Int64", + "Value": 23491023 + }, + "ty": "Int64" + }, + "NumberRange": { + "value": { + "Type": "NumberRange", + "Value": [ + -36.0, + 94.0 + ] + }, + "ty": "NumberRange" + }, + "NumberSequence": { + "value": { + "Type": "NumberSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Value": 5.0, + "Envelope": 2.0 + }, + { + "Time": 1.0, + "Value": 22.0, + "Envelope": 0.0 + } + ] + } + }, + "ty": "NumberSequence" + }, + "PhysicalProperties-Custom": { + "value": { + "Type": "PhysicalProperties", + "Value": { + "Density": 0.5, + "Friction": 1.0, + "Elasticity": 0.0, + "FrictionWeight": 50.0, + "ElasticityWeight": 25.0 + } + }, + "ty": "PhysicalProperties" + }, + "PhysicalProperties-Default": { + "value": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "ty": "PhysicalProperties" + }, + "Ray": { + "value": { + "Type": "Ray", + "Value": { + "Origin": [ + 1.0, + 2.0, + 3.0 + ], + "Direction": [ + 4.0, + 5.0, + 6.0 + ] + } + }, + "ty": "Ray" + }, + "Rect": { + "value": { + "Type": "Rect", + "Value": [ + [ + 0.0, + 5.0 + ], + [ + 10.0, + 15.0 + ] + ] + }, + "ty": "Rect" + }, + "Region3int16": { + "value": { + "Type": "Region3int16", + "Value": [ + [ + -10, + -5, + 0 + ], + [ + 5, + 10, + 15 + ] + ] + }, + "ty": "Region3int16" + }, + "String": { + "value": { + "Type": "String", + "Value": "Hello, world!" + }, + "ty": "String" + }, + "UDim": { + "value": { + "Type": "UDim", + "Value": [ + 1.0, + 32 + ] + }, + "ty": "UDim" + }, + "UDim2": { + "value": { + "Type": "UDim2", + "Value": [ + [ + -1.0, + 100 + ], + [ + 1.0, + -100 + ] + ] + }, + "ty": "UDim2" + }, + "Vector2": { + "value": { + "Type": "Vector2", + "Value": [ + -50.0, + 50.0 + ] + }, + "ty": "Vector2" + }, + "Vector2int16": { + "value": { + "Type": "Vector2int16", + "Value": [ + -300, + 300 + ] + }, + "ty": "Vector2int16" + }, + "Vector3": { + "value": { + "Type": "Vector3", + "Value": [ + -300.0, + 0.0, + 1500.0 + ] + }, + "ty": "Vector3" + }, + "Vector3int16": { + "value": { + "Type": "Vector3int16", + "Value": [ + 60, + 37, + -450 + ] + }, + "ty": "Vector3int16" + } +} \ 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/src/database.json b/plugin/rbx_dom_lua/src/database.json new file mode 100644 index 00000000..30ad0fdd --- /dev/null +++ b/plugin/rbx_dom_lua/src/database.json @@ -0,0 +1,44022 @@ +{ + "Version": [ + 0, + 465, + 0, + 417678 + ], + "Classes": { + "ABTestService": { + "Name": "ABTestService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Accessory": { + "Name": "Accessory", + "Tags": [], + "Superclass": "Accoutrement", + "Properties": {}, + "DefaultProperties": { + "AttachmentPoint": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Accoutrement": { + "Name": "Accoutrement", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "AttachmentForward": { + "Name": "AttachmentForward", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "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": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "AttachmentRight": { + "Name": "AttachmentRight", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "AttachmentUp": { + "Name": "AttachmentUp", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttachmentPoint": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Actor": { + "Name": "Actor", + "Tags": [], + "Superclass": "Model", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "LevelOfDetail": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "AdService": { + "Name": "AdService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "AdvancedDragger": { + "Name": "AdvancedDragger", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "AlignOrientation": { + "Name": "AlignOrientation", + "Tags": [], + "Superclass": "Constraint", + "Properties": { + "AlignType": { + "Name": "AlignType", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "AlignType" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "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" + } + } + } + }, + "DefaultProperties": { + "AlignType": { + "Type": "Enum", + "Value": 0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 23 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "MaxAngularVelocity": { + "Type": "Float32", + "Value": null + }, + "MaxTorque": { + "Type": "Float32", + "Value": 10000.0 + }, + "PrimaryAxisOnly": { + "Type": "Bool", + "Value": false + }, + "ReactionTorqueEnabled": { + "Type": "Bool", + "Value": false + }, + "Responsiveness": { + "Type": "Float32", + "Value": 10.0 + }, + "RigidityEnabled": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "AlignPosition": { + "Name": "AlignPosition", + "Tags": [], + "Superclass": "Constraint", + "Properties": { + "ApplyAtCenterOfMass": { + "Name": "ApplyAtCenterOfMass", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "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" + } + } + }, + "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": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 194 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "MaxForce": { + "Type": "Float32", + "Value": 10000.0 + }, + "MaxVelocity": { + "Type": "Float32", + "Value": null + }, + "ReactionForceEnabled": { + "Type": "Bool", + "Value": false + }, + "Responsiveness": { + "Type": "Float32", + "Value": 10.0 + }, + "RigidityEnabled": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "AnalysticsSettings": { + "Name": "AnalysticsSettings", + "Tags": [ + "NotCreatable" + ], + "Superclass": "GenericSettings", + "Properties": {}, + "DefaultProperties": {} + }, + "AnalyticsService": { + "Name": "AnalyticsService", + "Tags": [ + "Service" + ], + "Superclass": "Instance", + "Properties": { + "ApiKey": { + "Name": "ApiKey", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Deprecated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "ApiKey": { + "Type": "String", + "Value": "" + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 23 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "MaxTorque": { + "Type": "Float32", + "Value": 0.0 + }, + "ReactionTorqueEnabled": { + "Type": "Bool", + "Value": false + }, + "RelativeTo": { + "Type": "Enum", + "Value": 2 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "Animation": { + "Name": "Animation", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "AnimationId": { + "Name": "AnimationId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AnimationId": { + "Type": "Content", + "Value": "" + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "AnimationController": { + "Name": "AnimationController", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": {} + }, + "Animator": { + "Name": "Animator", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "AppStorageService": { + "Name": "AppStorageService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "LocalStorageService", + "Properties": {}, + "DefaultProperties": {} + }, + "AppUpdateService": { + "Name": "AppUpdateService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "ArcHandles": { + "Name": "ArcHandles", + "Tags": [], + "Superclass": "HandlesBase", + "Properties": { + "Axes": { + "Name": "Axes", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Axes" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Axes": { + "Type": "Axes", + "Value": [ + "X", + "Y", + "Z" + ] + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + } + } + }, + "AssetCounterService": { + "Name": "AssetCounterService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "AssetDeliveryProxy": { + "Name": "AssetDeliveryProxy", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "AssetManagerService": { + "Name": "AssetManagerService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "AssetService": { + "Name": "AssetService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Color3", + "Value": [ + 0.7843, + 0.6667, + 0.4235 + ] + }, + "Decay": { + "Type": "Color3", + "Value": [ + 0.3608, + 0.2353, + 0.0549 + ] + }, + "Density": { + "Type": "Float32", + "Value": 0.395 + }, + "Glare": { + "Type": "Float32", + "Value": 0.0 + }, + "Haze": { + "Type": "Float32", + "Value": 0.0 + }, + "Offset": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Position": { + "Name": "Position", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "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": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "WorldPosition": { + "Name": "WorldPosition", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "AvatarEditorService": { + "Name": "AvatarEditorService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Backpack": { + "Name": "Backpack", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "BackpackItem": { + "Name": "BackpackItem", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "TextureId": { + "Name": "TextureId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "BadgeService": { + "Name": "BadgeService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "BallSocketConstraint": { + "Name": "BallSocketConstraint", + "Tags": [], + "Superclass": "Constraint", + "Properties": { + "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" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 1009 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "LimitsEnabled": { + "Type": "Bool", + "Value": false + }, + "Radius": { + "Type": "Float32", + "Value": 0.15 + }, + "Restitution": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TwistLimitsEnabled": { + "Type": "Bool", + "Value": false + }, + "TwistLowerAngle": { + "Type": "Float32", + "Value": -45.0 + }, + "TwistUpperAngle": { + "Type": "Float32", + "Value": 45.0 + }, + "UpperAngle": { + "Type": "Float32", + "Value": 45.0 + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "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" + } + } + }, + "BackParamA": { + "Name": "BackParamA", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "BackParamB": { + "Name": "BackParamB", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "BottomParamA": { + "Name": "BottomParamA", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "BottomParamB": { + "Name": "BottomParamB", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "BrickColor": { + "Name": "BrickColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "BrickColor" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Alias": { + "AliasFor": "Color" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "CollisionGroupId": { + "Name": "CollisionGroupId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "CollisionGroups": { + "Name": "CollisionGroups", + "Scriptability": "Custom", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Color": { + "Name": "Color", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": { + "SerializesAs": "Color3uint8" + } + } + } + }, + "Color3uint8": { + "Name": "Color3uint8", + "Scriptability": "None", + "DataType": { + "Value": "Color3uint8" + }, + "Tags": [], + "Kind": { + "Alias": { + "AliasFor": "Color" + } + } + }, + "CustomPhysicalProperties": { + "Name": "CustomPhysicalProperties", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "PhysicalProperties" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Elasticity": { + "Name": "Elasticity", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "Deprecated", + "Hidden", + "NotReplicated" + ], + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "FrontParamB": { + "Name": "FrontParamB", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LeftParamA": { + "Name": "LeftParamA", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LeftParamB": { + "Name": "LeftParamB", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": [], + "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" + } + } + }, + "Orientation": { + "Name": "Orientation", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Position": { + "Name": "Position", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "RightParamB": { + "Name": "RightParamB", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": [], + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TopParamB": { + "Name": "TopParamB", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": [], + "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": { + "Alias": { + "AliasFor": "Color" + } + } + }, + "size": { + "Name": "size", + "Scriptability": "None", + "DataType": { + "Value": "Vector3" + }, + "Tags": [], + "Kind": { + "Alias": { + "AliasFor": "Size" + } + } + } + }, + "DefaultProperties": {} + }, + "BasePlayerGui": { + "Name": "BasePlayerGui", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "BaseScript": { + "Name": "BaseScript", + "Tags": [ + "NotCreatable" + ], + "Superclass": "LuaSourceContainer", + "Properties": { + "Disabled": { + "Name": "Disabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LinkedSource": { + "Name": "LinkedSource", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "BaseWrap": { + "Name": "BaseWrap", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "CageMeshId": { + "Name": "CageMeshId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "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" + } + } + } + }, + "DefaultProperties": {} + }, + "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" + } + } + }, + "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" + } + } + }, + "Segments": { + "Name": "Segments", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Texture": { + "Name": "Texture", + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "ColorSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Color": [ + 1.0, + 1.0, + 1.0 + ] + }, + { + "Time": 1.0, + "Color": [ + 1.0, + 1.0, + 1.0 + ] + } + ] + } + }, + "CurveSize0": { + "Type": "Float32", + "Value": 0.0 + }, + "CurveSize1": { + "Type": "Float32", + "Value": 0.0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "FaceCamera": { + "Type": "Bool", + "Value": false + }, + "LightEmission": { + "Type": "Float32", + "Value": 0.0 + }, + "LightInfluence": { + "Type": "Float32", + "Value": 0.0 + }, + "Segments": { + "Type": "Int32", + "Value": 10 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Texture": { + "Type": "Content", + "Value": "" + }, + "TextureLength": { + "Type": "Float32", + "Value": 1.0 + }, + "TextureMode": { + "Type": "Enum", + "Value": 0 + }, + "TextureSpeed": { + "Type": "Float32", + "Value": 1.0 + }, + "Transparency": { + "Type": "NumberSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Value": 0.5, + "Envelope": 0.0 + }, + { + "Time": 1.0, + "Value": 0.5, + "Envelope": 0.0 + } + ] + } + }, + "Width0": { + "Type": "Float32", + "Value": 1.0 + }, + "Width1": { + "Type": "Float32", + "Value": 1.0 + }, + "ZOffset": { + "Type": "Float32", + "Value": 0.0 + } + } + }, + "BevelMesh": { + "Name": "BevelMesh", + "Tags": [ + "Deprecated", + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "DataModelMesh", + "Properties": {}, + "DefaultProperties": {} + }, + "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" + } + } + }, + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "DistanceStep": { + "Name": "DistanceStep", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "DistanceUpperLimit": { + "Name": "DistanceUpperLimit", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": { + "Type": "Bool", + "Value": false + }, + "AlwaysOnTop": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "DistanceLowerLimit": { + "Type": "Float32", + "Value": 0.0 + }, + "DistanceStep": { + "Type": "Float32", + "Value": 0.0 + }, + "DistanceUpperLimit": { + "Type": "Float32", + "Value": -1.0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "ExtentsOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ExtentsOffsetWorldSpace": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "LightInfluence": { + "Type": "Float32", + "Value": 0.0 + }, + "MaxDistance": { + "Type": "Float32", + "Value": null + }, + "ResetOnSpawn": { + "Type": "Bool", + "Value": true + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeOffset": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "StudsOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "StudsOffsetWorldSpace": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "ZIndexBehavior": { + "Type": "Enum", + "Value": 0 + } + } + }, + "BinaryStringValue": { + "Name": "BinaryStringValue", + "Tags": [], + "Superclass": "ValueBase", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "BindableEvent": { + "Name": "BindableEvent", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "BindableFunction": { + "Name": "BindableFunction", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "BlockMesh": { + "Name": "BlockMesh", + "Tags": [], + "Superclass": "BevelMesh", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Offset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Scale": { + "Type": "Vector3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "VertexColor": { + "Type": "Vector3", + "Value": [ + 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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Intensity": { + "Type": "Float32", + "Value": 0.4 + }, + "Size": { + "Type": "Float32", + "Value": 24.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Threshold": { + "Type": "Float32", + "Value": 0.95 + } + } + }, + "BlurEffect": { + "Name": "BlurEffect", + "Tags": [], + "Superclass": "PostEffect", + "Properties": { + "Size": { + "Name": "Size", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Size": { + "Type": "Float32", + "Value": 24.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "BodyAngularVelocity": { + "Name": "BodyAngularVelocity", + "Tags": [], + "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": { + "Type": "Vector3", + "Value": [ + 0.0, + 2.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "MaxTorque": { + "Type": "Vector3", + "Value": [ + 4000.0, + 4000.0, + 4000.0 + ] + }, + "P": { + "Type": "Float32", + "Value": 1250.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "HeadColor3": { + "Type": "Color3", + "Value": [ + 0.9921569, + 0.9176471, + 0.5529412 + ] + }, + "LeftArmColor3": { + "Type": "Color3", + "Value": [ + 0.9921569, + 0.9176471, + 0.5529412 + ] + }, + "LeftLegColor3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "RightArmColor3": { + "Type": "Color3", + "Value": [ + 0.9921569, + 0.9176471, + 0.5529412 + ] + }, + "RightLegColor3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TorsoColor3": { + "Type": "Color3", + "Value": [ + 0.15686275, + 0.49803925, + 0.2784314 + ] + } + } + }, + "BodyForce": { + "Name": "BodyForce", + "Tags": [], + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Force": { + "Type": "Vector3", + "Value": [ + 0.0, + 1.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "BodyGyro": { + "Name": "BodyGyro", + "Tags": [], + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "D": { + "Type": "Float32", + "Value": 500.0 + }, + "MaxTorque": { + "Type": "Vector3", + "Value": [ + 400000.0, + 0.0, + 400000.0 + ] + }, + "P": { + "Type": "Float32", + "Value": 3000.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "BodyMover": { + "Name": "BodyMover", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "BodyPosition": { + "Name": "BodyPosition", + "Tags": [], + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "D": { + "Type": "Float32", + "Value": 1250.0 + }, + "MaxForce": { + "Type": "Vector3", + "Value": [ + 4000.0, + 4000.0, + 4000.0 + ] + }, + "P": { + "Type": "Float32", + "Value": 10000.0 + }, + "Position": { + "Type": "Vector3", + "Value": [ + 0.0, + 50.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "BodyThrust": { + "Name": "BodyThrust", + "Tags": [], + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Force": { + "Type": "Vector3", + "Value": [ + 0.0, + 1.0, + 0.0 + ] + }, + "Location": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "BodyVelocity": { + "Name": "BodyVelocity", + "Tags": [], + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "MaxForce": { + "Type": "Vector3", + "Value": [ + 4000.0, + 4000.0, + 4000.0 + ] + }, + "P": { + "Type": "Float32", + "Value": 1250.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 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": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "TransformedWorldCFrame": { + "Name": "TransformedWorldCFrame", + "Scriptability": "Read", + "DataType": { + "Value": "CFrame" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "BoolValue": { + "Name": "BoolValue", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "Bool", + "Value": false + } + } + }, + "BoxHandleAdornment": { + "Name": "BoxHandleAdornment", + "Tags": [], + "Superclass": "HandleAdornment", + "Properties": { + "Size": { + "Name": "Size", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AdornCullingMode": { + "Type": "Enum", + "Value": 0 + }, + "AlwaysOnTop": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "SizeRelativeOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": -1 + } + } + }, + "BrickColorValue": { + "Name": "BrickColorValue", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "BrickColor" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "Int32", + "Value": 194 + } + } + }, + "BrowserService": { + "Name": "BrowserService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "BulkImportService": { + "Name": "BulkImportService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "CFrameValue": { + "Name": "CFrameValue", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "CFrame" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "CFrame", + "Value": { + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "CacheableContentProvider": { + "Name": "CacheableContentProvider", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Camera": { + "Name": "Camera", + "Tags": [ + "NotReplicated" + ], + "Superclass": "Instance", + "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" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Enum", + "Value": 0 + }, + "FieldOfView": { + "Type": "Float32", + "Value": 70.0 + }, + "FieldOfViewMode": { + "Type": "Enum", + "Value": 0 + }, + "Focus": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "HeadScale": { + "Type": "Float32", + "Value": 1.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "CatalogPages": { + "Name": "CatalogPages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Pages", + "Properties": {}, + "DefaultProperties": {} + }, + "ChangeHistoryService": { + "Name": "ChangeHistoryService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "CharacterAppearance": { + "Name": "CharacterAppearance", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "CharacterMesh": { + "Name": "CharacterMesh", + "Tags": [], + "Superclass": "CharacterAppearance", + "Properties": { + "BaseTextureId": { + "Name": "BaseTextureId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "BodyPart": { + "Name": "BodyPart", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "BodyPart" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MeshId": { + "Name": "MeshId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "OverlayTextureId": { + "Name": "OverlayTextureId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BaseTextureId": { + "Type": "Int64", + "Value": 0 + }, + "BodyPart": { + "Type": "Enum", + "Value": 0 + }, + "MeshId": { + "Type": "Int64", + "Value": 0 + }, + "OverlayTextureId": { + "Type": "Int64", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Chat": { + "Name": "Chat", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "BubbleChatEnabled": { + "Name": "BubbleChatEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LoadDefaultChat": { + "Name": "LoadDefaultChat", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BubbleChatEnabled": { + "Type": "Bool", + "Value": false + }, + "LoadDefaultChat": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Depth": { + "Type": "Float32", + "Value": 0.15 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Mix": { + "Type": "Float32", + "Value": 0.5 + }, + "Priority": { + "Type": "Int32", + "Value": 0 + }, + "Rate": { + "Type": "Float32", + "Value": 0.5 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ClickDetector": { + "Name": "ClickDetector", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "CursorIcon": { + "Name": "CursorIcon", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MaxActivationDistance": { + "Name": "MaxActivationDistance", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CursorIcon": { + "Type": "Content", + "Value": "" + }, + "MaxActivationDistance": { + "Type": "Float32", + "Value": 32.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ClientReplicator": { + "Name": "ClientReplicator", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "NetworkReplicator", + "Properties": {}, + "DefaultProperties": {} + }, + "Clothing": { + "Name": "Clothing", + "Tags": [ + "NotCreatable" + ], + "Superclass": "CharacterAppearance", + "Properties": { + "Color3": { + "Name": "Color3", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "Clouds": { + "Name": "Clouds", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Cover": { + "Type": "Float32", + "Value": 0.5 + }, + "Density": { + "Type": "Float32", + "Value": 0.7 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ClusterPacketCache": { + "Name": "ClusterPacketCache", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "CollectionService": { + "Name": "CollectionService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Color3Value": { + "Name": "Color3Value", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "Color3", + "Value": [ + 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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Brightness": { + "Type": "Float32", + "Value": 0.0 + }, + "Contrast": { + "Type": "Float32", + "Value": 0.0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Saturation": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TintColor": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + } + } + }, + "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": { + "Attack": { + "Type": "Float32", + "Value": 0.1 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "GainMakeup": { + "Type": "Float32", + "Value": 0.0 + }, + "Priority": { + "Type": "Int32", + "Value": 0 + }, + "Ratio": { + "Type": "Float32", + "Value": 40.0 + }, + "Release": { + "Type": "Float32", + "Value": 0.1 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Threshold": { + "Type": "Float32", + "Value": -40.0 + } + } + }, + "ConeHandleAdornment": { + "Name": "ConeHandleAdornment", + "Tags": [], + "Superclass": "HandleAdornment", + "Properties": { + "Height": { + "Name": "Height", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Radius": { + "Name": "Radius", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AdornCullingMode": { + "Type": "Enum", + "Value": 0 + }, + "AlwaysOnTop": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "Height": { + "Type": "Float32", + "Value": 2.0 + }, + "Radius": { + "Type": "Float32", + "Value": 0.5 + }, + "SizeRelativeOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": -1 + } + } + }, + "Configuration": { + "Name": "Configuration", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": {} + }, + "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": {} + }, + "ContextActionService": { + "Name": "ContextActionService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Controller": { + "Name": "Controller", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "ControllerService": { + "Name": "ControllerService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "CookiesService": { + "Name": "CookiesService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "CoreGui": { + "Name": "CoreGui", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "BasePlayerGui", + "Properties": { + "SelectionImageObject": { + "Name": "SelectionImageObject", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Version": { + "Name": "Version", + "Scriptability": "Read", + "DataType": { + "Value": "Int32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "CorePackages": { + "Name": "CorePackages", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "CoreScript": { + "Name": "CoreScript", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "BaseScript", + "Properties": {}, + "DefaultProperties": {} + }, + "CoreScriptSyncService": { + "Name": "CoreScriptSyncService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "CornerWedgePart": { + "Name": "CornerWedgePart", + "Tags": [], + "Superclass": "BasePart", + "Properties": {}, + "DefaultProperties": { + "Anchored": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 0 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 2.0, + 2.0, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 0 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "CustomEvent": { + "Name": "CustomEvent", + "Tags": [ + "Deprecated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "CustomEventReceiver": { + "Name": "CustomEventReceiver", + "Tags": [ + "Deprecated" + ], + "Superclass": "Instance", + "Properties": { + "Source": { + "Name": "Source", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + } + }, + "DefaultProperties": { + "AdornCullingMode": { + "Type": "Enum", + "Value": 0 + }, + "AlwaysOnTop": { + "Type": "Bool", + "Value": false + }, + "Angle": { + "Type": "Float32", + "Value": 360.0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "Height": { + "Type": "Float32", + "Value": 1.0 + }, + "InnerRadius": { + "Type": "Float32", + "Value": 0.0 + }, + "Radius": { + "Type": "Float32", + "Value": 1.0 + }, + "SizeRelativeOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": -1 + } + } + }, + "CylinderMesh": { + "Name": "CylinderMesh", + "Tags": [ + "Deprecated" + ], + "Superclass": "BevelMesh", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Offset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Scale": { + "Type": "Vector3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "VertexColor": { + "Type": "Vector3", + "Value": [ + 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" + } + } + }, + "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" + } + } + }, + "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": { + "Type": "Enum", + "Value": 0 + }, + "AngularActuatorType": { + "Type": "Enum", + "Value": 0 + }, + "AngularLimitsEnabled": { + "Type": "Bool", + "Value": false + }, + "AngularRestitution": { + "Type": "Float32", + "Value": 0.0 + }, + "AngularSpeed": { + "Type": "Float32", + "Value": 0.0 + }, + "AngularVelocity": { + "Type": "Float32", + "Value": 0.0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 1009 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "InclinationAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "LimitsEnabled": { + "Type": "Bool", + "Value": false + }, + "LowerAngle": { + "Type": "Float32", + "Value": -45.0 + }, + "LowerLimit": { + "Type": "Float32", + "Value": 0.0 + }, + "MotorMaxAcceleration": { + "Type": "Float32", + "Value": null + }, + "MotorMaxAngularAcceleration": { + "Type": "Float32", + "Value": null + }, + "MotorMaxForce": { + "Type": "Float32", + "Value": 0.0 + }, + "MotorMaxTorque": { + "Type": "Float32", + "Value": 0.0 + }, + "Restitution": { + "Type": "Float32", + "Value": 0.0 + }, + "RotationAxisVisible": { + "Type": "Bool", + "Value": false + }, + "ServoMaxForce": { + "Type": "Float32", + "Value": 0.0 + }, + "ServoMaxTorque": { + "Type": "Float32", + "Value": 0.0 + }, + "Size": { + "Type": "Float32", + "Value": 0.15 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Speed": { + "Type": "Float32", + "Value": 0.0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TargetAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "TargetPosition": { + "Type": "Float32", + "Value": 0.0 + }, + "UpperAngle": { + "Type": "Float32", + "Value": 45.0 + }, + "UpperLimit": { + "Type": "Float32", + "Value": 5.0 + }, + "Velocity": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": 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" + } + } + }, + "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" + } + } + }, + "IsSFFlagsLoaded": { + "Name": "IsSFFlagsLoaded", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "JobId": { + "Name": "JobId", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "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" + } + } + }, + "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": {} + }, + "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": {} + }, + "DataModelSession": { + "Name": "DataModelSession", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "CurrentDataModelType": { + "Name": "CurrentDataModelType", + "Scriptability": "Read", + "DataType": { + "Enum": "StudioDataModelType" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "SessionId": { + "Name": "SessionId", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "DataStore": { + "Name": "DataStore", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "GlobalDataStore", + "Properties": {}, + "DefaultProperties": {} + }, + "DataStoreEnumerationPages": { + "Name": "DataStoreEnumerationPages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Pages", + "Properties": {}, + "DefaultProperties": {} + }, + "DataStoreIncrementOptions": { + "Name": "DataStoreIncrementOptions", + "Tags": [ + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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": {} + }, + "DataStoreKeyInfo": { + "Name": "DataStoreKeyInfo", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": { + "KeyName": { + "Name": "KeyName", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "DataStoreKeyPages": { + "Name": "DataStoreKeyPages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Pages", + "Properties": {}, + "DefaultProperties": {} + }, + "DataStoreKeyVersionInfo": { + "Name": "DataStoreKeyVersionInfo", + "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": {} + }, + "DataStorePages": { + "Name": "DataStorePages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Pages", + "Properties": {}, + "DefaultProperties": {} + }, + "DataStoreService": { + "Name": "DataStoreService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "AutomaticRetry": { + "Name": "AutomaticRetry", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LegacyNamingScheme": { + "Name": "LegacyNamingScheme", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Deprecated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutomaticRetry": { + "Type": "Bool", + "Value": true + }, + "LegacyNamingScheme": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "DataStoreSetOptions": { + "Name": "DataStoreSetOptions", + "Tags": [ + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "DataStoreVersionPages": { + "Name": "DataStoreVersionPages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Pages", + "Properties": {}, + "DefaultProperties": {} + }, + "Debris": { + "Name": "Debris", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "MaxItems": { + "Name": "MaxItems", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [ + "Deprecated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "MaxItems": { + "Type": "Int32", + "Value": 1000 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "DebugSettings": { + "Name": "DebugSettings", + "Tags": [ + "NotBrowsable", + "NotCreatable", + "Settings" + ], + "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": {} + }, + "DebuggerBreakpoint": { + "Name": "DebuggerBreakpoint", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "Condition": { + "Name": "Condition", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "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" + } + } + }, + "isContextDependentBreakpoint": { + "Name": "isContextDependentBreakpoint", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "DebuggerManager": { + "Name": "DebuggerManager", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": { + "DebuggingEnabled": { + "Name": "DebuggingEnabled", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "DebuggerWatch": { + "Name": "DebuggerWatch", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "Expression": { + "Name": "Expression", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "Decal": { + "Name": "Decal", + "Tags": [], + "Superclass": "FaceInstance", + "Properties": { + "Color3": { + "Name": "Color3", + "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" + } + } + }, + "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": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Transparency": { + "Name": "Transparency", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "Face": { + "Type": "Enum", + "Value": 5 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Texture": { + "Type": "Content", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "FarIntensity": { + "Type": "Float32", + "Value": 0.75 + }, + "FocusDistance": { + "Type": "Float32", + "Value": 0.05 + }, + "InFocusRadius": { + "Type": "Float32", + "Value": 10.0 + }, + "NearIntensity": { + "Type": "Float32", + "Value": 0.75 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BehaviorType": { + "Type": "Enum", + "Value": 0 + }, + "ConversationDistance": { + "Type": "Float32", + "Value": 25.0 + }, + "GoodbyeChoiceActive": { + "Type": "Bool", + "Value": true + }, + "GoodbyeDialog": { + "Type": "String", + "Value": "" + }, + "InitialPrompt": { + "Type": "String", + "Value": "" + }, + "Purpose": { + "Type": "Enum", + "Value": 1 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Tone": { + "Type": "Enum", + "Value": 0 + }, + "TriggerDistance": { + "Type": "Float32", + "Value": 0.0 + }, + "TriggerOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "GoodbyeChoiceActive": { + "Type": "Bool", + "Value": true + }, + "GoodbyeDialog": { + "Type": "String", + "Value": "" + }, + "ResponseDialog": { + "Type": "String", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "UserDialog": { + "Type": "String", + "Value": "" + } + } + }, + "DistortionSoundEffect": { + "Name": "DistortionSoundEffect", + "Tags": [], + "Superclass": "SoundEffect", + "Properties": { + "Level": { + "Name": "Level", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Level": { + "Type": "Float32", + "Value": 0.75 + }, + "Priority": { + "Type": "Int32", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": {} + }, + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "MaxValue": { + "Type": "Float64", + "Value": 1.0 + }, + "MinValue": { + "Type": "Float64", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "DraftsService": { + "Name": "DraftsService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Dragger": { + "Name": "Dragger", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "DynamicRotate": { + "Name": "DynamicRotate", + "Tags": [ + "NotCreatable" + ], + "Superclass": "JointInstance", + "Properties": { + "BaseAngle": { + "Name": "BaseAngle", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Delay": { + "Type": "Float32", + "Value": 1.0 + }, + "DryLevel": { + "Type": "Float32", + "Value": 0.0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Feedback": { + "Type": "Float32", + "Value": 0.5 + }, + "Priority": { + "Type": "Int32", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "WetLevel": { + "Type": "Float32", + "Value": 0.0 + } + } + }, + "EmotesPages": { + "Name": "EmotesPages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "InventoryPages", + "Properties": {}, + "DefaultProperties": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "HighGain": { + "Type": "Float32", + "Value": 0.0 + }, + "LowGain": { + "Type": "Float32", + "Value": -20.0 + }, + "MidGain": { + "Type": "Float32", + "Value": -10.0 + }, + "Priority": { + "Type": "Int32", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "EventIngestService": { + "Name": "EventIngestService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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" + } + } + }, + "Position": { + "Name": "Position", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Visible": { + "Name": "Visible", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BlastPressure": { + "Type": "Float32", + "Value": 500000.0 + }, + "BlastRadius": { + "Type": "Float32", + "Value": 4.0 + }, + "DestroyJointRadiusPercent": { + "Type": "Float32", + "Value": 1.0 + }, + "ExplosionType": { + "Type": "Enum", + "Value": 1 + }, + "Position": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": true + } + } + }, + "FaceInstance": { + "Name": "FaceInstance", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "Face": { + "Name": "Face", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "NormalId" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "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": {} + }, + "File": { + "Name": "File", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": { + "FileName": { + "Name": "FileName", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Deprecated", + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "FileSize": { + "Name": "FileSize", + "Scriptability": "Read", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Deprecated", + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Size": { + "Name": "Size", + "Scriptability": "Read", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "FileMesh": { + "Name": "FileMesh", + "Tags": [], + "Superclass": "DataModelMesh", + "Properties": { + "MeshId": { + "Name": "MeshId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TextureId": { + "Name": "TextureId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "MeshId": { + "Type": "Content", + "Value": "" + }, + "Offset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Scale": { + "Type": "Vector3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TextureId": { + "Type": "Content", + "Value": "" + }, + "VertexColor": { + "Type": "Vector3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + } + } + }, + "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" + } + } + } + }, + "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" + } + } + } + }, + "heat_xml": { + "Name": "heat_xml", + "Scriptability": "None", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": [], + "Kind": { + "Alias": { + "AliasFor": "Size" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Color3", + "Value": [ + 0.92549026, + 0.54509807, + 0.27450982 + ] + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Heat": { + "Type": "Float32", + "Value": 9.0 + }, + "SecondaryColor": { + "Type": "Color3", + "Value": [ + 0.54509807, + 0.3137255, + 0.21568629 + ] + }, + "Size": { + "Type": "Float32", + "Value": 5.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Flag": { + "Name": "Flag", + "Tags": [ + "Deprecated" + ], + "Superclass": "Tool", + "Properties": { + "TeamColor": { + "Name": "TeamColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "BrickColor" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CanBeDropped": { + "Type": "Bool", + "Value": true + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Grip": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "ManualActivationOnly": { + "Type": "Bool", + "Value": false + }, + "RequiresHandle": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TeamColor": { + "Type": "Int32", + "Value": 194 + }, + "TextureId": { + "Type": "Content", + "Value": "" + }, + "ToolTip": { + "Type": "String", + "Value": "" + } + } + }, + "FlagStand": { + "Name": "FlagStand", + "Tags": [ + "Deprecated" + ], + "Superclass": "Part", + "Properties": { + "TeamColor": { + "Name": "TeamColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "BrickColor" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "Anchored": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 4 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "FormFactor": { + "Type": "Enum", + "Value": 1 + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Shape": { + "Type": "Enum", + "Value": 1 + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TeamColor": { + "Type": "Int32", + "Value": 194 + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 3 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "FlagStandService": { + "Name": "FlagStandService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Depth": { + "Type": "Float32", + "Value": 0.45 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Mix": { + "Type": "Float32", + "Value": 0.85 + }, + "Priority": { + "Type": "Int32", + "Value": 0 + }, + "Rate": { + "Type": "Float32", + "Value": 5.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": "Content" + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "CycleOffset": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "StudsBetweenTextures": { + "Type": "Float32", + "Value": 4.0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Texture": { + "Type": "Content", + "Value": "" + }, + "TextureSize": { + "Type": "Vector2", + "Value": [ + 1.0, + 1.0 + ] + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Float32", + "Value": 2.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "WireRadius": { + "Type": "Float32", + "Value": 0.0625 + } + } + }, + "FlyweightService": { + "Name": "FlyweightService", + "Tags": [ + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Folder": { + "Name": "Folder", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ForceField": { + "Name": "ForceField", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "Visible": { + "Name": "Visible", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": 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": [], + "Kind": { + "Alias": { + "AliasFor": "FormFactor" + } + } + } + }, + "DefaultProperties": {} + }, + "Frame": { + "Name": "Frame", + "Tags": [], + "Superclass": "GuiObject", + "Properties": { + "Style": { + "Name": "Style", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "FrameStyle" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "Active": { + "Type": "Bool", + "Value": false + }, + "AnchorPoint": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "AutomaticSize": { + "Type": "Enum", + "Value": 0 + }, + "BackgroundColor3": { + "Type": "Color3", + "Value": [ + 0.6392157, + 0.63529414, + 0.64705884 + ] + }, + "BackgroundTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "BorderColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "BorderMode": { + "Type": "Enum", + "Value": 0 + }, + "BorderSizePixel": { + "Type": "Int32", + "Value": 1 + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "Draggable": { + "Type": "Bool", + "Value": false + }, + "LayoutOrder": { + "Type": "Int32", + "Value": 0 + }, + "Position": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "Selectable": { + "Type": "Bool", + "Value": false + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeConstraint": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Style": { + "Type": "Enum", + "Value": 0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": 1 + } + } + }, + "FriendPages": { + "Name": "FriendPages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Pages", + "Properties": {}, + "DefaultProperties": {} + }, + "FriendService": { + "Name": "FriendService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "FunctionalTest": { + "Name": "FunctionalTest", + "Tags": [ + "Deprecated" + ], + "Superclass": "Instance", + "Properties": { + "Description": { + "Name": "Description", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Description": { + "Type": "String", + "Value": "?" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "GamePassService": { + "Name": "GamePassService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "GameSettings": { + "Name": "GameSettings", + "Tags": [ + "NotBrowsable", + "NotCreatable", + "Settings" + ], + "Superclass": "Instance", + "Properties": { + "AdditionalCoreIncludeDirs": { + "Name": "AdditionalCoreIncludeDirs", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "OverrideStarterScript": { + "Name": "OverrideStarterScript", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "VideoCaptureEnabled": { + "Name": "VideoCaptureEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "VideoRecording": { + "Name": "VideoRecording", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "GamepadService": { + "Name": "GamepadService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "GamepadCursorEnabled": { + "Name": "GamepadCursorEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "GenericSettings": { + "Name": "GenericSettings", + "Tags": [ + "NotCreatable" + ], + "Superclass": "ServiceProvider", + "Properties": {}, + "DefaultProperties": {} + }, + "Geometry": { + "Name": "Geometry", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "GetDataStoreOptions": { + "Name": "GetDataStoreOptions", + "Tags": [ + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": { + "AllScopes": { + "Name": "AllScopes", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "GlobalDataStore": { + "Name": "GlobalDataStore", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "GlobalSettings": { + "Name": "GlobalSettings", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "GenericSettings", + "Properties": {}, + "DefaultProperties": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "F0": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "F1": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "F2": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "F3": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "GoogleAnalyticsConfiguration": { + "Name": "GoogleAnalyticsConfiguration", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "GroupService": { + "Name": "GroupService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "GuiBase": { + "Name": "GuiBase", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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" + } + } + }, + "AutoLocalize": { + "Name": "AutoLocalize", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ClippedRect": { + "Name": "ClippedRect", + "Scriptability": "Read", + "DataType": { + "Value": "Rect" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "IsNotOccluded": { + "Name": "IsNotOccluded", + "Scriptability": "Read", + "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": "Read", + "DataType": { + "Value": "Rect" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RootLocalizationTable": { + "Name": "RootLocalizationTable", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TotalGroupScale": { + "Name": "TotalGroupScale", + "Scriptability": "Read", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "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": {} + }, + "GuiButton": { + "Name": "GuiButton", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "GuiObject", + "Properties": { + "AutoButtonColor": { + "Name": "AutoButtonColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Modal": { + "Name": "Modal", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "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": {} + }, + "GuiLabel": { + "Name": "GuiLabel", + "Tags": [ + "NotCreatable" + ], + "Superclass": "GuiObject", + "Properties": {}, + "DefaultProperties": {} + }, + "GuiMain": { + "Name": "GuiMain", + "Tags": [ + "Deprecated" + ], + "Superclass": "ScreenGui", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "DisplayOrder": { + "Type": "Int32", + "Value": 0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "IgnoreGuiInset": { + "Type": "Bool", + "Value": false + }, + "ResetOnSpawn": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "ZIndexBehavior": { + "Type": "Enum", + "Value": 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" + } + } + }, + "Draggable": { + "Name": "Draggable", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Deprecated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LayoutOrder": { + "Name": "LayoutOrder", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "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": [ + "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": {} + }, + "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": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "CoreGuiFolder": { + "Name": "CoreGuiFolder", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "CoreGuiNavigationEnabled": { + "Name": "CoreGuiNavigationEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "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" + } + } + }, + "SelectedCoreObject": { + "Name": "SelectedCoreObject", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "SelectedObject": { + "Name": "SelectedObject", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "GuidRegistryService": { + "Name": "GuidRegistryService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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" + } + } + }, + "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": {} + }, + "Handles": { + "Name": "Handles", + "Tags": [], + "Superclass": "HandlesBase", + "Properties": { + "Faces": { + "Name": "Faces", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Faces" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Style": { + "Name": "Style", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "HandlesStyle" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "Faces": { + "Type": "Faces", + "Value": [ + "Right", + "Top", + "Back", + "Left", + "Bottom", + "Front" + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Style": { + "Type": "Enum", + "Value": 0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + } + } + }, + "HandlesBase": { + "Name": "HandlesBase", + "Tags": [ + "NotCreatable" + ], + "Superclass": "PartAdornment", + "Properties": {}, + "DefaultProperties": {} + }, + "HapticService": { + "Name": "HapticService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Hat": { + "Name": "Hat", + "Tags": [ + "Deprecated" + ], + "Superclass": "Accoutrement", + "Properties": {}, + "DefaultProperties": { + "AttachmentPoint": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "HeightmapImporterService": { + "Name": "HeightmapImporterService", + "Tags": [ + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "HingeConstraint": { + "Name": "HingeConstraint", + "Tags": [], + "Superclass": "Constraint", + "Properties": { + "ActuatorType": { + "Name": "ActuatorType", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "ActuatorType" + }, + "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" + } + } + }, + "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": { + "Type": "Enum", + "Value": 0 + }, + "AngularSpeed": { + "Type": "Float32", + "Value": 0.0 + }, + "AngularVelocity": { + "Type": "Float32", + "Value": 0.0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 1009 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "LimitsEnabled": { + "Type": "Bool", + "Value": false + }, + "LowerAngle": { + "Type": "Float32", + "Value": -45.0 + }, + "MotorMaxAcceleration": { + "Type": "Float32", + "Value": null + }, + "MotorMaxTorque": { + "Type": "Float32", + "Value": 0.0 + }, + "Radius": { + "Type": "Float32", + "Value": 0.15 + }, + "Restitution": { + "Type": "Float32", + "Value": 0.0 + }, + "ServoMaxTorque": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TargetAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "UpperAngle": { + "Type": "Float32", + "Value": 45.0 + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "Hint": { + "Name": "Hint", + "Tags": [ + "Deprecated" + ], + "Superclass": "Message", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Text": { + "Type": "String", + "Value": "" + } + } + }, + "Hole": { + "Name": "Hole", + "Tags": [ + "Deprecated" + ], + "Superclass": "Feature", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "FaceId": { + "Type": "Enum", + "Value": 0 + }, + "InOut": { + "Type": "Enum", + "Value": 2 + }, + "LeftRight": { + "Type": "Enum", + "Value": 1 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopBottom": { + "Type": "Enum", + "Value": 1 + } + } + }, + "Hopper": { + "Name": "Hopper", + "Tags": [ + "Deprecated", + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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" + } + } + } + }, + "DefaultProperties": { + "Active": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BinType": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TextureId": { + "Type": "Content", + "Value": "" + } + } + }, + "HttpRbxApiService": { + "Name": "HttpRbxApiService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "HttpRequest": { + "Name": "HttpRequest", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "HttpService": { + "Name": "HttpService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "HttpEnabled": { + "Name": "HttpEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "HttpEnabled": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "CameraOffset": { + "Name": "CameraOffset", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "CollisionType": { + "Name": "CollisionType", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "HumanoidCollisionType" + }, + "Tags": [], + "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" + } + } + }, + "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" + } + } + }, + "HipHeight": { + "Name": "HipHeight", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "TargetPoint": { + "Name": "TargetPoint", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [], + "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" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoJumpEnabled": { + "Type": "Bool", + "Value": true + }, + "AutoRotate": { + "Type": "Bool", + "Value": true + }, + "AutomaticScalingEnabled": { + "Type": "Bool", + "Value": true + }, + "BreakJointsOnDeath": { + "Type": "Bool", + "Value": true + }, + "CollisionType": { + "Type": "Enum", + "Value": 0 + }, + "DisplayDistanceType": { + "Type": "Enum", + "Value": 0 + }, + "DisplayName": { + "Type": "String", + "Value": "" + }, + "HealthDisplayDistance": { + "Type": "Float32", + "Value": 100.0 + }, + "HealthDisplayType": { + "Type": "Enum", + "Value": 0 + }, + "HipHeight": { + "Type": "Float32", + "Value": 0.0 + }, + "JumpHeight": { + "Type": "Float32", + "Value": 7.2 + }, + "JumpPower": { + "Type": "Float32", + "Value": 50.0 + }, + "MaxHealth": { + "Type": "Float32", + "Value": 100.0 + }, + "MaxSlopeAngle": { + "Type": "Float32", + "Value": 89.0 + }, + "NameDisplayDistance": { + "Type": "Float32", + "Value": 100.0 + }, + "NameOcclusion": { + "Type": "Enum", + "Value": 2 + }, + "RequiresNeck": { + "Type": "Bool", + "Value": true + }, + "RigType": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "UseJumpPower": { + "Type": "Bool", + "Value": true + }, + "WalkSpeed": { + "Type": "Float32", + "Value": 16.0 + } + } + }, + "HumanoidController": { + "Name": "HumanoidController", + "Tags": [], + "Superclass": "Controller", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "HumanoidDescription": { + "Name": "HumanoidDescription", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "BackAccessory": { + "Name": "BackAccessory", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "Face": { + "Name": "Face", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "FaceAccessory": { + "Name": "FaceAccessory", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "FallAnimation": { + "Name": "FallAnimation", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "FrontAccessory": { + "Name": "FrontAccessory", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GraphicTShirt": { + "Name": "GraphicTShirt", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "HairAccessory": { + "Name": "HairAccessory", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "HatAccessory": { + "Name": "HatAccessory", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Head": { + "Name": "Head", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "HeadColor": { + "Name": "HeadColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LeftArmColor": { + "Name": "LeftArmColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LeftLeg": { + "Name": "LeftLeg", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LeftLegColor": { + "Name": "LeftLegColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "NeckAccessory": { + "Name": "NeckAccessory", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "NumberEmotesLoaded": { + "Name": "NumberEmotesLoaded", + "Scriptability": "ReadWrite", + "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" + } + } + }, + "RightArm": { + "Name": "RightArm", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "RightArmColor": { + "Name": "RightArmColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "RightLeg": { + "Name": "RightLeg", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "RightLegColor": { + "Name": "RightLegColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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": [], + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TorsoColor": { + "Name": "TorsoColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "WaistAccessory": { + "Name": "WaistAccessory", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackAccessory": { + "Type": "String", + "Value": "" + }, + "BodyTypeScale": { + "Type": "Float32", + "Value": 0.3 + }, + "ClimbAnimation": { + "Type": "Int64", + "Value": 0 + }, + "DepthScale": { + "Type": "Float32", + "Value": 1.0 + }, + "Face": { + "Type": "Int64", + "Value": 0 + }, + "FaceAccessory": { + "Type": "String", + "Value": "" + }, + "FallAnimation": { + "Type": "Int64", + "Value": 0 + }, + "FrontAccessory": { + "Type": "String", + "Value": "" + }, + "GraphicTShirt": { + "Type": "Int64", + "Value": 0 + }, + "HairAccessory": { + "Type": "String", + "Value": "" + }, + "HatAccessory": { + "Type": "String", + "Value": "" + }, + "Head": { + "Type": "Int64", + "Value": 0 + }, + "HeadColor": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "HeadScale": { + "Type": "Float32", + "Value": 1.0 + }, + "HeightScale": { + "Type": "Float32", + "Value": 1.0 + }, + "IdleAnimation": { + "Type": "Int64", + "Value": 0 + }, + "JumpAnimation": { + "Type": "Int64", + "Value": 0 + }, + "LeftArm": { + "Type": "Int64", + "Value": 0 + }, + "LeftArmColor": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "LeftLeg": { + "Type": "Int64", + "Value": 0 + }, + "LeftLegColor": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "NeckAccessory": { + "Type": "String", + "Value": "" + }, + "Pants": { + "Type": "Int64", + "Value": 0 + }, + "ProportionScale": { + "Type": "Float32", + "Value": 1.0 + }, + "RightArm": { + "Type": "Int64", + "Value": 0 + }, + "RightArmColor": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "RightLeg": { + "Type": "Int64", + "Value": 0 + }, + "RightLegColor": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "RunAnimation": { + "Type": "Int64", + "Value": 0 + }, + "Shirt": { + "Type": "Int64", + "Value": 0 + }, + "ShouldersAccessory": { + "Type": "String", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "SwimAnimation": { + "Type": "Int64", + "Value": 0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Torso": { + "Type": "Int64", + "Value": 0 + }, + "TorsoColor": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "WaistAccessory": { + "Type": "String", + "Value": "" + }, + "WalkAnimation": { + "Type": "Int64", + "Value": 0 + }, + "WidthScale": { + "Type": "Float32", + "Value": 1.0 + } + } + }, + "ILegacyStudioBridge": { + "Name": "ILegacyStudioBridge", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "IXPService": { + "Name": "IXPService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "ImageButton": { + "Name": "ImageButton", + "Tags": [], + "Superclass": "GuiButton", + "Properties": { + "HoverImage": { + "Name": "HoverImage", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Image": { + "Name": "Image", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ImageColor3": { + "Name": "ImageColor3", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "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" + } + } + }, + "PressedImage": { + "Name": "PressedImage", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "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": { + "Type": "Bool", + "Value": true + }, + "AnchorPoint": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoButtonColor": { + "Type": "Bool", + "Value": true + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "AutomaticSize": { + "Type": "Enum", + "Value": 0 + }, + "BackgroundColor3": { + "Type": "Color3", + "Value": [ + 0.6392157, + 0.63529414, + 0.64705884 + ] + }, + "BackgroundTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "BorderColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "BorderMode": { + "Type": "Enum", + "Value": 0 + }, + "BorderSizePixel": { + "Type": "Int32", + "Value": 1 + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "Draggable": { + "Type": "Bool", + "Value": false + }, + "HoverImage": { + "Type": "Content", + "Value": "" + }, + "Image": { + "Type": "Content", + "Value": "" + }, + "ImageColor3": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "ImageRectOffset": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "ImageRectSize": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "ImageTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "LayoutOrder": { + "Type": "Int32", + "Value": 0 + }, + "Modal": { + "Type": "Bool", + "Value": false + }, + "Position": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "PressedImage": { + "Type": "Content", + "Value": "" + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "ScaleType": { + "Type": "Enum", + "Value": 0 + }, + "Selectable": { + "Type": "Bool", + "Value": true + }, + "Selected": { + "Type": "Bool", + "Value": false + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeConstraint": { + "Type": "Enum", + "Value": 0 + }, + "SliceCenter": { + "Type": "Rect", + "Value": [ + [ + 0.0, + 0.0 + ], + [ + 0.0, + 0.0 + ] + ] + }, + "SliceScale": { + "Type": "Float32", + "Value": 1.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Style": { + "Type": "Enum", + "Value": 0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TileSize": { + "Type": "UDim2", + "Value": [ + [ + 1.0, + 0 + ], + [ + 1.0, + 0 + ] + ] + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": 1 + } + } + }, + "ImageHandleAdornment": { + "Name": "ImageHandleAdornment", + "Tags": [], + "Superclass": "HandleAdornment", + "Properties": { + "Image": { + "Name": "Image", + "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": { + "Type": "Enum", + "Value": 0 + }, + "AlwaysOnTop": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.9490197, + 0.95294124, + 0.95294124 + ] + }, + "Image": { + "Type": "Content", + "Value": "rbxasset://textures/SurfacesDefault.png" + }, + "Size": { + "Type": "Vector2", + "Value": [ + 1.0, + 1.0 + ] + }, + "SizeRelativeOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": -1 + } + } + }, + "ImageLabel": { + "Name": "ImageLabel", + "Tags": [], + "Superclass": "GuiLabel", + "Properties": { + "Image": { + "Name": "Image", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ImageColor3": { + "Name": "ImageColor3", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "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" + } + } + }, + "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": { + "Type": "Bool", + "Value": false + }, + "AnchorPoint": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "AutomaticSize": { + "Type": "Enum", + "Value": 0 + }, + "BackgroundColor3": { + "Type": "Color3", + "Value": [ + 0.6392157, + 0.63529414, + 0.64705884 + ] + }, + "BackgroundTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "BorderColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "BorderMode": { + "Type": "Enum", + "Value": 0 + }, + "BorderSizePixel": { + "Type": "Int32", + "Value": 1 + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "Draggable": { + "Type": "Bool", + "Value": false + }, + "Image": { + "Type": "Content", + "Value": "" + }, + "ImageColor3": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "ImageRectOffset": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "ImageRectSize": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "ImageTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "LayoutOrder": { + "Type": "Int32", + "Value": 0 + }, + "Position": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "ScaleType": { + "Type": "Enum", + "Value": 0 + }, + "Selectable": { + "Type": "Bool", + "Value": false + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeConstraint": { + "Type": "Enum", + "Value": 0 + }, + "SliceCenter": { + "Type": "Rect", + "Value": [ + [ + 0.0, + 0.0 + ], + [ + 0.0, + 0.0 + ] + ] + }, + "SliceScale": { + "Type": "Float32", + "Value": 1.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TileSize": { + "Type": "UDim2", + "Value": [ + [ + 1.0, + 0 + ], + [ + 1.0, + 0 + ] + ] + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": 1 + } + } + }, + "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": {} + }, + "InsertService": { + "Name": "InsertService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "AllowClientInsertModels": { + "Name": "AllowClientInsertModels", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "AllowInsertFreeModels": { + "Name": "AllowInsertFreeModels", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Deprecated", + "NotBrowsable", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AllowClientInsertModels": { + "Type": "Bool", + "Value": false + }, + "AllowInsertFreeModels": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Instance": { + "Name": "Instance", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": null, + "Properties": { + "Archivable": { + "Name": "Archivable", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": { + "SerializesAs": "archivable" + } + } + } + }, + "Attributes": { + "Name": "Attributes", + "Scriptability": "None", + "DataType": { + "Value": "BinaryString" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": { + "SerializesAs": "AttributesSerialize" + } + } + } + }, + "AttributesSerialize": { + "Name": "AttributesSerialize", + "Scriptability": "None", + "DataType": { + "Value": "BinaryString" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ClassName": { + "Name": "ClassName", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "DataCost": { + "Name": "DataCost", + "Scriptability": "Read", + "DataType": { + "Value": "Int32" + }, + "Tags": [ + "Deprecated", + "NotReplicated", + "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" + } + } + }, + "RobloxLocked": { + "Name": "RobloxLocked", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "SourceAssetId": { + "Name": "SourceAssetId", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Tags": { + "Name": "Tags", + "Scriptability": "Custom", + "DataType": { + "Value": "BinaryString" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "archivable": { + "Name": "archivable", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Deprecated", + "Hidden", + "NotReplicated" + ], + "Kind": { + "Alias": { + "AliasFor": "Archivable" + } + } + }, + "className": { + "Name": "className", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Deprecated", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Alias": { + "AliasFor": "ClassName" + } + } + } + }, + "DefaultProperties": {} + }, + "InstanceAdornment": { + "Name": "InstanceAdornment", + "Tags": [ + "NotCreatable" + ], + "Superclass": "GuiBase3d", + "Properties": { + "Adornee": { + "Name": "Adornee", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "MaxValue": { + "Type": "Int64", + "Value": 10 + }, + "MinValue": { + "Type": "Int64", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "IntValue": { + "Name": "IntValue", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "Int64", + "Value": 0 + } + } + }, + "InternalContainer": { + "Name": "InternalContainer", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "InventoryPages": { + "Name": "InventoryPages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Pages", + "Properties": {}, + "DefaultProperties": {} + }, + "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": {} + }, + "JointsService": { + "Name": "JointsService", + "Tags": [ + "Deprecated", + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "KeyboardService": { + "Name": "KeyboardService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Keyframe": { + "Name": "Keyframe", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "Time": { + "Name": "Time", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Time": { + "Type": "Float32", + "Value": 0.0 + } + } + }, + "KeyframeMarker": { + "Name": "KeyframeMarker", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "String", + "Value": "" + } + } + }, + "KeyframeSequence": { + "Name": "KeyframeSequence", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "AuthoredHipHeight": { + "Name": "AuthoredHipHeight", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AuthoredHipHeight": { + "Type": "Float32", + "Value": 2.0 + }, + "Loop": { + "Type": "Bool", + "Value": true + }, + "Priority": { + "Type": "Enum", + "Value": 2 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "KeyframeSequenceProvider": { + "Name": "KeyframeSequenceProvider", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "LanguageService": { + "Name": "LanguageService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "ZIndexBehavior": { + "Name": "ZIndexBehavior", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "ZIndexBehavior" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "LegacyStudioBridge": { + "Name": "LegacyStudioBridge", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "ILegacyStudioBridge", + "Properties": {}, + "DefaultProperties": {} + }, + "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": {} + }, + "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": "DoesNotSerialize" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TimeOfDay": { + "Name": "TimeOfDay", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "Ambient": { + "Type": "Color3", + "Value": [ + 0.5, + 0.5, + 0.5 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Brightness": { + "Type": "Float32", + "Value": 1.0 + }, + "ColorShift_Bottom": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "ColorShift_Top": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "EnvironmentDiffuseScale": { + "Type": "Float32", + "Value": 0.0 + }, + "EnvironmentSpecularScale": { + "Type": "Float32", + "Value": 0.0 + }, + "ExposureCompensation": { + "Type": "Float32", + "Value": 0.0 + }, + "FogColor": { + "Type": "Color3", + "Value": [ + 0.75, + 0.75, + 0.75 + ] + }, + "FogEnd": { + "Type": "Float32", + "Value": 100000.0 + }, + "FogStart": { + "Type": "Float32", + "Value": 0.0 + }, + "GeographicLatitude": { + "Type": "Float32", + "Value": 41.7333 + }, + "GlobalShadows": { + "Type": "Bool", + "Value": false + }, + "OutdoorAmbient": { + "Type": "Color3", + "Value": [ + 0.5, + 0.5, + 0.5 + ] + }, + "Outlines": { + "Type": "Bool", + "Value": true + }, + "ShadowSoftness": { + "Type": "Float32", + "Value": 0.5 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Technology": { + "Type": "Enum", + "Value": 2 + }, + "TimeOfDay": { + "Type": "String", + "Value": "14:00:00" + } + } + }, + "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": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 23 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "InverseSquareLaw": { + "Type": "Bool", + "Value": false + }, + "Magnitude": { + "Type": "Float32", + "Value": 1000.0 + }, + "MaxForce": { + "Type": "Float32", + "Value": null + }, + "ReactionForceEnabled": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": 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": { + "Type": "Enum", + "Value": 0 + }, + "AlwaysOnTop": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "Length": { + "Type": "Float32", + "Value": 5.0 + }, + "SizeRelativeOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Thickness": { + "Type": "Float32", + "Value": 1.0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": -1 + } + } + }, + "LocalScript": { + "Name": "LocalScript", + "Tags": [], + "Superclass": "Script", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Disabled": { + "Type": "Bool", + "Value": false + }, + "LinkedSource": { + "Type": "Content", + "Value": "" + }, + "Source": { + "Type": "String", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "LocalStorageService": { + "Name": "LocalStorageService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "LocalizationService": { + "Name": "LocalizationService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "ForcePlayModeGameLocaleId": { + "Name": "ForcePlayModeGameLocaleId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "ForcePlayModeRobloxLocaleId": { + "Name": "ForcePlayModeRobloxLocaleId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "IsTextScraperRunning": { + "Name": "IsTextScraperRunning", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RobloxForcePlayModeGameLocaleId": { + "Name": "RobloxForcePlayModeGameLocaleId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RobloxForcePlayModeRobloxLocaleId": { + "Name": "RobloxForcePlayModeRobloxLocaleId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RobloxLocaleId": { + "Name": "RobloxLocaleId", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "SystemLocaleId": { + "Name": "SystemLocaleId", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "LocalizationTable": { + "Name": "LocalizationTable", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "Contents": { + "Name": "Contents", + "Scriptability": "Custom", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "DevelopmentLanguage": { + "Name": "DevelopmentLanguage", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Deprecated", + "Hidden", + "NotReplicated" + ], + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Contents": { + "Type": "String", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "SourceLocaleId": { + "Type": "String", + "Value": "en-us" + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "LogService": { + "Name": "LogService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "LoginService": { + "Name": "LoginService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "LuaSettings": { + "Name": "LuaSettings", + "Tags": [ + "NotCreatable", + "Settings" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "LuaSourceContainer": { + "Name": "LuaSourceContainer", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "CurrentEditor": { + "Name": "CurrentEditor", + "Scriptability": "None", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "IsDifferentFromFileSystem": { + "Name": "IsDifferentFromFileSystem", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "LuaWebService": { + "Name": "LuaWebService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ManualGlue": { + "Name": "ManualGlue", + "Tags": [], + "Superclass": "ManualSurfaceJointInstance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ManualSurfaceJointInstance": { + "Name": "ManualSurfaceJointInstance", + "Tags": [ + "NotCreatable" + ], + "Superclass": "JointInstance", + "Properties": {}, + "DefaultProperties": {} + }, + "ManualWeld": { + "Name": "ManualWeld", + "Tags": [], + "Superclass": "ManualSurfaceJointInstance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "MarketplaceService": { + "Name": "MarketplaceService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "MemStorageConnection": { + "Name": "MemStorageConnection", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "MemStorageService": { + "Name": "MemStorageService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "MeshContentProvider": { + "Name": "MeshContentProvider", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "CacheableContentProvider", + "Properties": {}, + "DefaultProperties": {} + }, + "MeshPart": { + "Name": "MeshPart", + "Tags": [], + "Superclass": "TriangleMeshPart", + "Properties": { + "DoubleSided": { + "Name": "DoubleSided", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "HasJointOffset": { + "Name": "HasJointOffset", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "HasSkinnedMesh": { + "Name": "HasSkinnedMesh", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "JointOffset": { + "Name": "JointOffset", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MeshID": { + "Name": "MeshID", + "Scriptability": "None", + "DataType": { + "Value": "Content" + }, + "Tags": [ + "Deprecated", + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MeshId": { + "Name": "MeshId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MeshSize": { + "Name": "MeshSize", + "Scriptability": "Read", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RenderFidelity": { + "Name": "RenderFidelity", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "RenderFidelity" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TextureID": { + "Name": "TextureID", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "Anchored": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 0 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "DoubleSided": { + "Type": "Bool", + "Value": false + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "HasJointOffset": { + "Type": "Bool", + "Value": false + }, + "HasSkinnedMesh": { + "Type": "Bool", + "Value": false + }, + "JointOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "MeshID": { + "Type": "Content", + "Value": "" + }, + "MeshId": { + "Type": "Content", + "Value": "" + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RenderFidelity": { + "Type": "Enum", + "Value": 1 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TextureID": { + "Type": "Content", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 0 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "Message": { + "Name": "Message", + "Tags": [ + "Deprecated" + ], + "Superclass": "Instance", + "Properties": { + "Text": { + "Name": "Text", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Text": { + "Type": "String", + "Value": "" + } + } + }, + "MessagingService": { + "Name": "MessagingService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Model": { + "Name": "Model", + "Tags": [], + "Superclass": "PVInstance", + "Properties": { + "LevelOfDetail": { + "Name": "LevelOfDetail", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "ModelLevelOfDetail" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PrimaryPart": { + "Name": "PrimaryPart", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "LevelOfDetail": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ModuleScript": { + "Name": "ModuleScript", + "Tags": [], + "Superclass": "LuaSourceContainer", + "Properties": { + "LinkedSource": { + "Name": "LinkedSource", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Source": { + "Name": "Source", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "LinkedSource": { + "Type": "Content", + "Value": "" + }, + "Source": { + "Type": "String", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "DesiredAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "MaxVelocity": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Motor6D": { + "Name": "Motor6D", + "Tags": [], + "Superclass": "Motor", + "Properties": { + "ChildName": { + "Name": "ChildName", + "Scriptability": "None", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "NotScriptable", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "ParentName": { + "Name": "ParentName", + "Scriptability": "None", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "NotScriptable", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Transform": { + "Name": "Transform", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "CFrame" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "DesiredAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "MaxVelocity": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "MotorFeature": { + "Name": "MotorFeature", + "Tags": [ + "Deprecated" + ], + "Superclass": "Feature", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "FaceId": { + "Type": "Enum", + "Value": 0 + }, + "InOut": { + "Type": "Enum", + "Value": 2 + }, + "LeftRight": { + "Type": "Enum", + "Value": 1 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopBottom": { + "Type": "Enum", + "Value": 1 + } + } + }, + "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": "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": {} + }, + "MouseService": { + "Name": "MouseService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "MultipleDocumentInterfaceInstance": { + "Name": "MultipleDocumentInterfaceInstance", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": { + "FocusedDataModelSession": { + "Name": "FocusedDataModelSession", + "Scriptability": "Read", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "NegateOperation": { + "Name": "NegateOperation", + "Tags": [], + "Superclass": "PartOperation", + "Properties": {}, + "DefaultProperties": { + "Anchored": { + "Type": "Bool", + "Value": true + }, + "AssetId": { + "Type": "Content", + "Value": "" + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 0 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": false + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 255, + 255, + 255 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RenderFidelity": { + "Type": "Enum", + "Value": 1 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SmoothingAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 0 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.1 + }, + "UsePartColor": { + "Type": "Bool", + "Value": false + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "NetworkClient": { + "Name": "NetworkClient", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "NetworkPeer", + "Properties": {}, + "DefaultProperties": {} + }, + "NetworkMarker": { + "Name": "NetworkMarker", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "NetworkPeer": { + "Name": "NetworkPeer", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "NetworkReplicator": { + "Name": "NetworkReplicator", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "NetworkServer": { + "Name": "NetworkServer", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "NetworkPeer", + "Properties": {}, + "DefaultProperties": {} + }, + "NetworkSettings": { + "Name": "NetworkSettings", + "Tags": [ + "NotBrowsable", + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "ExtraMemoryUsed": { + "Name": "ExtraMemoryUsed", + "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": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "HttpProxyURL": { + "Name": "HttpProxyURL", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "IncomingReplicationLag": { + "Name": "IncomingReplicationLag", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float64" + }, + "Tags": [], + "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" + } + } + }, + "TrackDataTypes": { + "Name": "TrackDataTypes", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TrackPhysicsDetails": { + "Name": "TrackPhysicsDetails", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "NonReplicatedCSGDictionaryService": { + "Name": "NonReplicatedCSGDictionaryService", + "Tags": [ + "Service" + ], + "Superclass": "FlyweightService", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "NotificationService": { + "Name": "NotificationService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "IsLuaChatEnabled": { + "Name": "IsLuaChatEnabled", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "IsLuaGameDetailsEnabled": { + "Name": "IsLuaGameDetailsEnabled", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "SelectedTheme": { + "Name": "SelectedTheme", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "NumberPose": { + "Name": "NumberPose", + "Tags": [], + "Superclass": "PoseBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "EasingDirection": { + "Type": "Enum", + "Value": 0 + }, + "EasingStyle": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "Float64", + "Value": 0.0 + }, + "Weight": { + "Type": "Float32", + "Value": 1.0 + } + } + }, + "NumberValue": { + "Name": "NumberValue", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "Float64", + "Value": 0.0 + } + } + }, + "ObjectValue": { + "Name": "ObjectValue", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ObjectVersionInfo": { + "Name": "ObjectVersionInfo", + "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": {} + }, + "OrderedDataStore": { + "Name": "OrderedDataStore", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "GlobalDataStore", + "Properties": {}, + "DefaultProperties": {} + }, + "OutfitPages": { + "Name": "OutfitPages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Pages", + "Properties": {}, + "DefaultProperties": {} + }, + "PVAdornment": { + "Name": "PVAdornment", + "Tags": [ + "NotCreatable" + ], + "Superclass": "GuiBase3d", + "Properties": { + "Adornee": { + "Name": "Adornee", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "PVInstance": { + "Name": "PVInstance", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "PackageLink": { + "Name": "PackageLink", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "AutoUpdate": { + "Name": "AutoUpdate", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PackageId": { + "Name": "PackageId", + "Scriptability": "Read", + "DataType": { + "Value": "Content" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Status": { + "Name": "Status", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "VersionNumber": { + "Name": "VersionNumber", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "PackageService": { + "Name": "PackageService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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": {} + }, + "Pants": { + "Name": "Pants", + "Tags": [], + "Superclass": "Clothing", + "Properties": { + "PantsTemplate": { + "Name": "PantsTemplate", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "PantsTemplate": { + "Type": "Content", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ParabolaAdornment": { + "Name": "ParabolaAdornment", + "Tags": [], + "Superclass": "PVAdornment", + "Properties": { + "A": { + "Name": "A", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "B": { + "Name": "B", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "C": { + "Name": "C", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Range": { + "Name": "Range", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Thickness": { + "Name": "Thickness", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.9490197, + 0.95294124, + 0.95294124 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + } + } + }, + "Part": { + "Name": "Part", + "Tags": [], + "Superclass": "FormFactorPart", + "Properties": { + "Shape": { + "Name": "Shape", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "PartType" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": { + "SerializesAs": "shape" + } + } + } + }, + "shape": { + "Name": "shape", + "Scriptability": "None", + "DataType": { + "Enum": "PartType" + }, + "Tags": [], + "Kind": { + "Alias": { + "AliasFor": "Shape" + } + } + } + }, + "DefaultProperties": { + "Anchored": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 4 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "FormFactor": { + "Type": "Enum", + "Value": 1 + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Shape": { + "Type": "Enum", + "Value": 1 + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 3 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 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": {} + }, + "PartOperation": { + "Name": "PartOperation", + "Tags": [], + "Superclass": "TriangleMeshPart", + "Properties": { + "AssetId": { + "Name": "AssetId", + "Scriptability": "None", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "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" + } + } + }, + "TriangleCount": { + "Name": "TriangleCount", + "Scriptability": "Read", + "DataType": { + "Value": "Int32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "UsePartColor": { + "Name": "UsePartColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "Anchored": { + "Type": "Bool", + "Value": false + }, + "AssetId": { + "Type": "Content", + "Value": "" + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 0 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 255, + 255, + 255 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RenderFidelity": { + "Type": "Enum", + "Value": 1 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SmoothingAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 0 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "UsePartColor": { + "Type": "Bool", + "Value": false + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "PartOperationAsset": { + "Name": "PartOperationAsset", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ParticleEmitter": { + "Name": "ParticleEmitter", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "Acceleration": { + "Name": "Acceleration", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "Texture": { + "Name": "Texture", + "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" + } + } + }, + "ZOffset": { + "Name": "ZOffset", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "Acceleration": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "ColorSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Color": [ + 1.0, + 1.0, + 1.0 + ] + }, + { + "Time": 1.0, + "Color": [ + 1.0, + 1.0, + 1.0 + ] + } + ] + } + }, + "Drag": { + "Type": "Float32", + "Value": 0.0 + }, + "EmissionDirection": { + "Type": "Enum", + "Value": 1 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Lifetime": { + "Type": "NumberRange", + "Value": [ + 5.0, + 10.0 + ] + }, + "LightEmission": { + "Type": "Float32", + "Value": 0.0 + }, + "LightInfluence": { + "Type": "Float32", + "Value": 0.0 + }, + "LockedToPart": { + "Type": "Bool", + "Value": false + }, + "Orientation": { + "Type": "Enum", + "Value": 0 + }, + "Rate": { + "Type": "Float32", + "Value": 20.0 + }, + "RotSpeed": { + "Type": "NumberRange", + "Value": [ + 0.0, + 0.0 + ] + }, + "Rotation": { + "Type": "NumberRange", + "Value": [ + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "NumberSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Value": 1.0, + "Envelope": 0.0 + }, + { + "Time": 1.0, + "Value": 1.0, + "Envelope": 0.0 + } + ] + } + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Speed": { + "Type": "NumberRange", + "Value": [ + 5.0, + 5.0 + ] + }, + "SpreadAngle": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Texture": { + "Type": "Content", + "Value": "rbxasset://textures/particles/sparkles_main.dds" + }, + "TimeScale": { + "Type": "Float32", + "Value": 1.0 + }, + "Transparency": { + "Type": "NumberSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Value": 0.0, + "Envelope": 0.0 + }, + { + "Time": 1.0, + "Value": 0.0, + "Envelope": 0.0 + } + ] + } + }, + "VelocityInheritance": { + "Type": "Float32", + "Value": 0.0 + }, + "ZOffset": { + "Type": "Float32", + "Value": 0.0 + } + } + }, + "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": {} + }, + "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": {} + }, + "PermissionsService": { + "Name": "PermissionsService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "PhysicsService": { + "Name": "PhysicsService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "PhysicsSettings": { + "Name": "PhysicsSettings", + "Tags": [ + "NotCreatable", + "Settings" + ], + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "AreJointCoordinatesShown": { + "Name": "AreJointCoordinatesShown", + "Scriptability": "ReadWrite", + "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" + } + } + }, + "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" + } + } + }, + "AreTerrainReplicationRegionsShown": { + "Name": "AreTerrainReplicationRegionsShown", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "AreTimestepsShown": { + "Name": "AreTimestepsShown", + "Scriptability": "ReadWrite", + "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" + } + } + }, + "DisableCSGv2": { + "Name": "DisableCSGv2", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ForceCSGv2": { + "Name": "ForceCSGv2", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "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" + } + } + }, + "ThrottleAdjustTime": { + "Name": "ThrottleAdjustTime", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "UseCSGv2": { + "Name": "UseCSGv2", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "PitchShiftSoundEffect": { + "Name": "PitchShiftSoundEffect", + "Tags": [], + "Superclass": "SoundEffect", + "Properties": { + "Octave": { + "Name": "Octave", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Octave": { + "Type": "Float32", + "Value": 1.25 + }, + "Priority": { + "Type": "Int32", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Platform": { + "Name": "Platform", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Part", + "Properties": {}, + "DefaultProperties": {} + }, + "Player": { + "Name": "Player", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "AccountAge": { + "Name": "AccountAge", + "Scriptability": "Read", + "DataType": { + "Value": "Int32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "AppearanceDidLoad": { + "Name": "AppearanceDidLoad", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Deprecated", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "AutoJumpEnabled": { + "Name": "AutoJumpEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "ChatMode": { + "Name": "ChatMode", + "Scriptability": "Read", + "DataType": { + "Enum": "ChatMode" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "DataComplexity": { + "Name": "DataComplexity", + "Scriptability": "Read", + "DataType": { + "Value": "Int32" + }, + "Tags": [ + "Deprecated", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "DataComplexityLimit": { + "Name": "DataComplexityLimit", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [ + "Deprecated", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "DataReady": { + "Name": "DataReady", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Deprecated", + "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" + } + } + }, + "GameplayPaused": { + "Name": "GameplayPaused", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Guest": { + "Name": "Guest", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "HealthDisplayDistance": { + "Name": "HealthDisplayDistance", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LocaleId": { + "Name": "LocaleId", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "MaximumSimulationRadius": { + "Name": "MaximumSimulationRadius", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "MembershipType": { + "Name": "MembershipType", + "Scriptability": "Read", + "DataType": { + "Enum": "MembershipType" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "NameDisplayDistance": { + "Name": "NameDisplayDistance", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Neutral": { + "Name": "Neutral", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "OsPlatform": { + "Name": "OsPlatform", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "PlatformName": { + "Name": "PlatformName", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "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": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "TeleportedIn": { + "Name": "TeleportedIn", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "UserId": { + "Name": "UserId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "VRDevice": { + "Name": "VRDevice", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "userId": { + "Name": "userId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Deprecated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "PlayerEmulatorService": { + "Name": "PlayerEmulatorService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "EmulatedCountryCode": { + "Name": "EmulatedCountryCode", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "EmulatedGameLocale": { + "Name": "EmulatedGameLocale", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PlayerEmulationEnabled": { + "Name": "PlayerEmulationEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PlayerEmulationEnabled_deprecated": { + "Name": "PlayerEmulationEnabled_deprecated", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "SerializedEmulatedPolicyInfo": { + "Name": "SerializedEmulatedPolicyInfo", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "StudioEmulatedCountryRegionCode": { + "Name": "StudioEmulatedCountryRegionCode", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "EmulatedCountryCode": { + "Type": "String", + "Value": "" + }, + "EmulatedGameLocale": { + "Type": "String", + "Value": "" + }, + "PlayerEmulationEnabled": { + "Type": "Bool", + "Value": false + }, + "SerializedEmulatedPolicyInfo": { + "Type": "String", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "PlayerGui": { + "Name": "PlayerGui", + "Tags": [ + "NotCreatable", + "PlayerReplicated" + ], + "Superclass": "BasePlayerGui", + "Properties": { + "CurrentScreenOrientation": { + "Name": "CurrentScreenOrientation", + "Scriptability": "Read", + "DataType": { + "Enum": "ScreenOrientation" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "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": {} + }, + "PlayerMouse": { + "Name": "PlayerMouse", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Mouse", + "Properties": {}, + "DefaultProperties": {} + }, + "PlayerScripts": { + "Name": "PlayerScripts", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Players": { + "Name": "Players", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "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": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "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": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Alias": { + "AliasFor": "PreferredPlayers" + } + } + }, + "RespawnTime": { + "Name": "RespawnTime", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CharacterAutoLoads": { + "Type": "Bool", + "Value": true + }, + "MaxPlayers": { + "Type": "Int32", + "Value": 12 + }, + "PreferredPlayers": { + "Type": "Int32", + "Value": 0 + }, + "RespawnTime": { + "Type": "Float32", + "Value": 5.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Plugin": { + "Name": "Plugin", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "CollisionEnabled": { + "Name": "CollisionEnabled", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "GridSize": { + "Name": "GridSize", + "Scriptability": "Read", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "HostDataModelType": { + "Name": "HostDataModelType", + "Scriptability": "Read", + "DataType": { + "Enum": "StudioDataModelType" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "HostDataModelTypeIsCurrent": { + "Name": "HostDataModelTypeIsCurrent", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "MultipleDocumentInterfaceInstance": { + "Name": "MultipleDocumentInterfaceInstance", + "Scriptability": "Read", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "UsesAssetInsertionDrag": { + "Name": "UsesAssetInsertionDrag", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "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": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "DefaultShortcut": { + "Name": "DefaultShortcut", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Enabled": { + "Name": "Enabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "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", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "PluginDebugService": { + "Name": "PluginDebugService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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": {} + }, + "PluginGui": { + "Name": "PluginGui", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "LayerCollector", + "Properties": { + "Title": { + "Name": "Title", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "PluginGuiService": { + "Name": "PluginGuiService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "PluginManager": { + "Name": "PluginManager", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "PluginManagerInterface": { + "Name": "PluginManagerInterface", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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" + } + } + } + }, + "DefaultProperties": {} + }, + "PluginMouse": { + "Name": "PluginMouse", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Mouse", + "Properties": {}, + "DefaultProperties": {} + }, + "PluginToolbar": { + "Name": "PluginToolbar", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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": "Content" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "PointLight": { + "Name": "PointLight", + "Tags": [], + "Superclass": "Light", + "Properties": { + "Range": { + "Name": "Range", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Brightness": { + "Type": "Float32", + "Value": 1.0 + }, + "Color": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Range": { + "Type": "Float32", + "Value": 8.0 + }, + "Shadows": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "PointsService": { + "Name": "PointsService", + "Tags": [ + "Deprecated", + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "PolicyService": { + "Name": "PolicyService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "IsLuobuServer": { + "Name": "IsLuobuServer", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "TriStateBoolean" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LuobuWhitelisted": { + "Name": "LuobuWhitelisted", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "TriStateBoolean" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "EasingDirection": { + "Type": "Enum", + "Value": 0 + }, + "EasingStyle": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Weight": { + "Type": "Float32", + "Value": 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": {} + }, + "PostEffect": { + "Name": "PostEffect", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "Enabled": { + "Name": "Enabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "PrismaticConstraint": { + "Name": "PrismaticConstraint", + "Tags": [], + "Superclass": "SlidingBallConstraint", + "Properties": {}, + "DefaultProperties": { + "ActuatorType": { + "Type": "Enum", + "Value": 0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 1009 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "LimitsEnabled": { + "Type": "Bool", + "Value": false + }, + "LowerLimit": { + "Type": "Float32", + "Value": 0.0 + }, + "MotorMaxAcceleration": { + "Type": "Float32", + "Value": null + }, + "MotorMaxForce": { + "Type": "Float32", + "Value": 0.0 + }, + "Restitution": { + "Type": "Float32", + "Value": 0.0 + }, + "ServoMaxForce": { + "Type": "Float32", + "Value": 0.0 + }, + "Size": { + "Type": "Float32", + "Value": 0.15 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Speed": { + "Type": "Float32", + "Value": 0.0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TargetPosition": { + "Type": "Float32", + "Value": 0.0 + }, + "UpperLimit": { + "Type": "Float32", + "Value": 5.0 + }, + "Velocity": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "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" + } + } + }, + "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": { + "Type": "String", + "Value": "Interact" + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "ClickablePrompt": { + "Type": "Bool", + "Value": true + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Exclusivity": { + "Type": "Enum", + "Value": 0 + }, + "GamepadKeyCode": { + "Type": "Enum", + "Value": 1000 + }, + "HoldDuration": { + "Type": "Float32", + "Value": 0.0 + }, + "KeyboardKeyCode": { + "Type": "Enum", + "Value": 101 + }, + "MaxActivationDistance": { + "Type": "Float32", + "Value": 10.0 + }, + "ObjectText": { + "Type": "String", + "Value": "" + }, + "RequiresLineOfSight": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Style": { + "Type": "Enum", + "Value": 0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "UIOffset": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + } + } + }, + "ProximityPromptService": { + "Name": "ProximityPromptService", + "Tags": [ + "NotBrowsable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "Enabled": { + "Name": "Enabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MaxPromptsVisible": { + "Name": "MaxPromptsVisible", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "MaxPromptsVisible": { + "Type": "Int32", + "Value": 16 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "QWidgetPluginGui": { + "Name": "QWidgetPluginGui", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "PluginGui", + "Properties": {}, + "DefaultProperties": {} + }, + "RayValue": { + "Name": "RayValue", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ray" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "Ray", + "Value": { + "Origin": [ + 0.0, + 0.0, + 0.0 + ], + "Direction": [ + 0.0, + 0.0, + 0.0 + ] + } + } + } + }, + "RbxAnalyticsService": { + "Name": "RbxAnalyticsService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "ReflectionMetadata": { + "Name": "ReflectionMetadata", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ReflectionMetadataCallbacks": { + "Name": "ReflectionMetadataCallbacks", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Browsable": { + "Type": "Bool", + "Value": true + }, + "ClassCategory": { + "Type": "String", + "Value": "" + }, + "ClientOnly": { + "Type": "Bool", + "Value": false + }, + "Constraint": { + "Type": "String", + "Value": "" + }, + "Deprecated": { + "Type": "Bool", + "Value": false + }, + "EditingDisabled": { + "Type": "Bool", + "Value": false + }, + "ExplorerImageIndex": { + "Type": "Int32", + "Value": 0 + }, + "ExplorerOrder": { + "Type": "Int32", + "Value": 2147483647 + }, + "Insertable": { + "Type": "Bool", + "Value": true + }, + "IsBackend": { + "Type": "Bool", + "Value": false + }, + "PreferredParent": { + "Type": "String", + "Value": "" + }, + "PropertyOrder": { + "Type": "Int32", + "Value": 5000 + }, + "ScriptContext": { + "Type": "String", + "Value": "" + }, + "ServerOnly": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "UIMaximum": { + "Type": "Float64", + "Value": 0.0 + }, + "UIMinimum": { + "Type": "Float64", + "Value": 0.0 + }, + "UINumTicks": { + "Type": "Float64", + "Value": 0.0 + }, + "summary": { + "Type": "String", + "Value": "" + } + } + }, + "ReflectionMetadataClasses": { + "Name": "ReflectionMetadataClasses", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ReflectionMetadataEnum": { + "Name": "ReflectionMetadataEnum", + "Tags": [], + "Superclass": "ReflectionMetadataItem", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Browsable": { + "Type": "Bool", + "Value": true + }, + "ClassCategory": { + "Type": "String", + "Value": "" + }, + "ClientOnly": { + "Type": "Bool", + "Value": false + }, + "Constraint": { + "Type": "String", + "Value": "" + }, + "Deprecated": { + "Type": "Bool", + "Value": false + }, + "EditingDisabled": { + "Type": "Bool", + "Value": false + }, + "IsBackend": { + "Type": "Bool", + "Value": false + }, + "PropertyOrder": { + "Type": "Int32", + "Value": 5000 + }, + "ScriptContext": { + "Type": "String", + "Value": "" + }, + "ServerOnly": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "UIMaximum": { + "Type": "Float64", + "Value": 0.0 + }, + "UIMinimum": { + "Type": "Float64", + "Value": 0.0 + }, + "UINumTicks": { + "Type": "Float64", + "Value": 0.0 + }, + "summary": { + "Type": "String", + "Value": "" + } + } + }, + "ReflectionMetadataEnumItem": { + "Name": "ReflectionMetadataEnumItem", + "Tags": [], + "Superclass": "ReflectionMetadataItem", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Browsable": { + "Type": "Bool", + "Value": true + }, + "ClassCategory": { + "Type": "String", + "Value": "" + }, + "ClientOnly": { + "Type": "Bool", + "Value": false + }, + "Constraint": { + "Type": "String", + "Value": "" + }, + "Deprecated": { + "Type": "Bool", + "Value": false + }, + "EditingDisabled": { + "Type": "Bool", + "Value": false + }, + "IsBackend": { + "Type": "Bool", + "Value": false + }, + "PropertyOrder": { + "Type": "Int32", + "Value": 5000 + }, + "ScriptContext": { + "Type": "String", + "Value": "" + }, + "ServerOnly": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "UIMaximum": { + "Type": "Float64", + "Value": 0.0 + }, + "UIMinimum": { + "Type": "Float64", + "Value": 0.0 + }, + "UINumTicks": { + "Type": "Float64", + "Value": 0.0 + }, + "summary": { + "Type": "String", + "Value": "" + } + } + }, + "ReflectionMetadataEnums": { + "Name": "ReflectionMetadataEnums", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ReflectionMetadataEvents": { + "Name": "ReflectionMetadataEvents", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ReflectionMetadataFunctions": { + "Name": "ReflectionMetadataFunctions", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "summary": { + "Name": "summary", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "ReflectionMetadataMember": { + "Name": "ReflectionMetadataMember", + "Tags": [], + "Superclass": "ReflectionMetadataItem", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Browsable": { + "Type": "Bool", + "Value": true + }, + "ClassCategory": { + "Type": "String", + "Value": "" + }, + "ClientOnly": { + "Type": "Bool", + "Value": false + }, + "Constraint": { + "Type": "String", + "Value": "" + }, + "Deprecated": { + "Type": "Bool", + "Value": false + }, + "EditingDisabled": { + "Type": "Bool", + "Value": false + }, + "IsBackend": { + "Type": "Bool", + "Value": false + }, + "PropertyOrder": { + "Type": "Int32", + "Value": 5000 + }, + "ScriptContext": { + "Type": "String", + "Value": "" + }, + "ServerOnly": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "UIMaximum": { + "Type": "Float64", + "Value": 0.0 + }, + "UIMinimum": { + "Type": "Float64", + "Value": 0.0 + }, + "UINumTicks": { + "Type": "Float64", + "Value": 0.0 + }, + "summary": { + "Type": "String", + "Value": "" + } + } + }, + "ReflectionMetadataProperties": { + "Name": "ReflectionMetadataProperties", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ReflectionMetadataYieldFunctions": { + "Name": "ReflectionMetadataYieldFunctions", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "RemoteEvent": { + "Name": "RemoteEvent", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "RemoteFunction": { + "Name": "RemoteFunction", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "RenderSettings": { + "Name": "RenderSettings", + "Tags": [ + "NotBrowsable", + "NotCreatable", + "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" + } + } + }, + "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" + } + } + } + }, + "DefaultProperties": {} + }, + "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": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Position": { + "Name": "Position", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "QualityLevel": { + "Name": "QualityLevel", + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "ComparisonDiffThreshold": { + "Type": "Int32", + "Value": 10 + }, + "ComparisonMethod": { + "Type": "Enum", + "Value": 0 + }, + "ComparisonPsnrThreshold": { + "Type": "Float32", + "Value": 50.0 + }, + "Description": { + "Type": "String", + "Value": "" + }, + "FieldOfView": { + "Type": "Float32", + "Value": 70.0 + }, + "QualityLevel": { + "Type": "Int32", + "Value": 21 + }, + "ShouldSkip": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Ticket": { + "Type": "String", + "Value": "" + } + } + }, + "ReplicatedFirst": { + "Name": "ReplicatedFirst", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ReplicatedScriptService": { + "Name": "ReplicatedScriptService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ReplicatedStorage": { + "Name": "ReplicatedStorage", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "DecayTime": { + "Type": "Float32", + "Value": 1.5 + }, + "Density": { + "Type": "Float32", + "Value": 1.0 + }, + "Diffusion": { + "Type": "Float32", + "Value": 1.0 + }, + "DryLevel": { + "Type": "Float32", + "Value": -6.0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Priority": { + "Type": "Int32", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "WetLevel": { + "Type": "Float32", + "Value": 0.0 + } + } + }, + "RobloxPluginGuiService": { + "Name": "RobloxPluginGuiService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "RobloxReplicatedStorage": { + "Name": "RobloxReplicatedStorage", + "Tags": [ + "NotBrowsable", + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "RocketPropulsion": { + "Name": "RocketPropulsion", + "Tags": [], + "Superclass": "BodyMover", + "Properties": { + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CartoonFactor": { + "Type": "Float32", + "Value": 0.7 + }, + "MaxSpeed": { + "Type": "Float32", + "Value": 30.0 + }, + "MaxThrust": { + "Type": "Float32", + "Value": 4000.0 + }, + "MaxTorque": { + "Type": "Vector3", + "Value": [ + 400000.0, + 400000.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TargetOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "TargetRadius": { + "Type": "Float32", + "Value": 4.0 + }, + "ThrustD": { + "Type": "Float32", + "Value": 0.001 + }, + "ThrustP": { + "Type": "Float32", + "Value": 5.0 + }, + "TurnD": { + "Type": "Float32", + "Value": 500.0 + }, + "TurnP": { + "Type": "Float32", + "Value": 3000.0 + } + } + }, + "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" + } + } + }, + "Thickness": { + "Name": "Thickness", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 26 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Length": { + "Type": "Float32", + "Value": 5.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Thickness": { + "Type": "Float32", + "Value": 0.1 + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 25 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Length": { + "Type": "Float32", + "Value": 5.0 + }, + "Restitution": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Thickness": { + "Type": "Float32", + "Value": 0.1 + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "Rotate": { + "Name": "Rotate", + "Tags": [], + "Superclass": "JointInstance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "RotateP": { + "Name": "RotateP", + "Tags": [], + "Superclass": "DynamicRotate", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BaseAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "RotateV": { + "Name": "RotateV", + "Tags": [], + "Superclass": "DynamicRotate", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BaseAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "RunService": { + "Name": "RunService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "RunningAverageItemDouble": { + "Name": "RunningAverageItemDouble", + "Tags": [ + "NotCreatable" + ], + "Superclass": "StatsItem", + "Properties": {}, + "DefaultProperties": {} + }, + "RunningAverageItemInt": { + "Name": "RunningAverageItemInt", + "Tags": [ + "NotCreatable" + ], + "Superclass": "StatsItem", + "Properties": {}, + "DefaultProperties": {} + }, + "RunningAverageTimeIntervalItem": { + "Name": "RunningAverageTimeIntervalItem", + "Tags": [ + "NotCreatable" + ], + "Superclass": "StatsItem", + "Properties": {}, + "DefaultProperties": {} + }, + "RuntimeScriptService": { + "Name": "RuntimeScriptService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "ScreenGui": { + "Name": "ScreenGui", + "Tags": [], + "Superclass": "LayerCollector", + "Properties": { + "DisplayOrder": { + "Name": "DisplayOrder", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "IgnoreGuiInset": { + "Name": "IgnoreGuiInset", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "OnTopOfCoreBlur": { + "Name": "OnTopOfCoreBlur", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "DisplayOrder": { + "Type": "Int32", + "Value": 0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "IgnoreGuiInset": { + "Type": "Bool", + "Value": false + }, + "ResetOnSpawn": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "ZIndexBehavior": { + "Type": "Enum", + "Value": 0 + } + } + }, + "Script": { + "Name": "Script", + "Tags": [], + "Superclass": "BaseScript", + "Properties": { + "Source": { + "Name": "Source", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Disabled": { + "Type": "Bool", + "Value": false + }, + "LinkedSource": { + "Type": "Content", + "Value": "" + }, + "Source": { + "Type": "String", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ScriptContext": { + "Name": "ScriptContext", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "ScriptsDisabled": { + "Name": "ScriptsDisabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "ScriptDebugger": { + "Name": "ScriptDebugger", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { + "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" + } + } + } + }, + "DefaultProperties": {} + }, + "ScriptService": { + "Name": "ScriptService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ScrollingFrame": { + "Name": "ScrollingFrame", + "Tags": [], + "Superclass": "GuiObject", + "Properties": { + "AbsoluteCanvasSize": { + "Name": "AbsoluteCanvasSize", + "Scriptability": "Read", + "DataType": { + "Value": "Vector2" + }, + "Tags": [ + "Hidden", + "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": "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" + } + } + }, + "ElasticBehavior": { + "Name": "ElasticBehavior", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "ElasticBehavior" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "HorizontalBarRect": { + "Name": "HorizontalBarRect", + "Scriptability": "Read", + "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": "Read", + "DataType": { + "Value": "Vector2" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "MidImage": { + "Name": "MidImage", + "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" + } + } + }, + "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" + } + } + }, + "TopImage": { + "Name": "TopImage", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "VerticalBarRect": { + "Name": "VerticalBarRect", + "Scriptability": "Read", + "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": { + "Type": "Bool", + "Value": false + }, + "AnchorPoint": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "AutomaticCanvasSize": { + "Type": "Enum", + "Value": 0 + }, + "AutomaticSize": { + "Type": "Enum", + "Value": 0 + }, + "BackgroundColor3": { + "Type": "Color3", + "Value": [ + 0.6392157, + 0.63529414, + 0.64705884 + ] + }, + "BackgroundTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "BorderColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "BorderMode": { + "Type": "Enum", + "Value": 0 + }, + "BorderSizePixel": { + "Type": "Int32", + "Value": 1 + }, + "BottomImage": { + "Type": "Content", + "Value": "rbxasset://textures/ui/Scroll/scroll-bottom.png" + }, + "CanvasPosition": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "CanvasSize": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 2.0, + 0 + ] + ] + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": true + }, + "Draggable": { + "Type": "Bool", + "Value": false + }, + "ElasticBehavior": { + "Type": "Enum", + "Value": 0 + }, + "HorizontalScrollBarInset": { + "Type": "Enum", + "Value": 0 + }, + "LayoutOrder": { + "Type": "Int32", + "Value": 0 + }, + "MidImage": { + "Type": "Content", + "Value": "rbxasset://textures/ui/Scroll/scroll-middle.png" + }, + "Position": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "ScrollBarImageColor3": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "ScrollBarImageTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "ScrollBarThickness": { + "Type": "Int32", + "Value": 12 + }, + "ScrollingDirection": { + "Type": "Enum", + "Value": 4 + }, + "ScrollingEnabled": { + "Type": "Bool", + "Value": true + }, + "Selectable": { + "Type": "Bool", + "Value": true + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeConstraint": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopImage": { + "Type": "Content", + "Value": "rbxasset://textures/ui/Scroll/scroll-top.png" + }, + "VerticalScrollBarInset": { + "Type": "Enum", + "Value": 0 + }, + "VerticalScrollBarPosition": { + "Type": "Enum", + "Value": 0 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": 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": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 4 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "Disabled": { + "Type": "Bool", + "Value": false + }, + "FormFactor": { + "Type": "Enum", + "Value": 1 + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Shape": { + "Type": "Enum", + "Value": 1 + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 3 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "Selection": { + "Name": "Selection", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "ActiveInstance": { + "Name": "ActiveInstance", + "Scriptability": "Read", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "SelectionBox": { + "Name": "SelectionBox", + "Tags": [], + "Superclass": "InstanceAdornment", + "Properties": { + "LineThickness": { + "Name": "LineThickness", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "LineThickness": { + "Type": "Float32", + "Value": 0.15 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "SurfaceColor3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "SurfaceTransparency": { + "Type": "Float32", + "Value": 1.0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + } + } + }, + "SelectionLasso": { + "Name": "SelectionLasso", + "Tags": [ + "NotCreatable" + ], + "Superclass": "GuiBase3d", + "Properties": { + "Humanoid": { + "Name": "Humanoid", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "SelectionPartLasso": { + "Name": "SelectionPartLasso", + "Tags": [ + "Deprecated" + ], + "Superclass": "SelectionLasso", + "Properties": { + "Part": { + "Name": "Part", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + } + } + }, + "SelectionPointLasso": { + "Name": "SelectionPointLasso", + "Tags": [ + "Deprecated" + ], + "Superclass": "SelectionLasso", + "Properties": { + "Point": { + "Name": "Point", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "Point": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": 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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "SurfaceColor3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "SurfaceTransparency": { + "Type": "Float32", + "Value": 1.0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + } + } + }, + "ServerReplicator": { + "Name": "ServerReplicator", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "NetworkReplicator", + "Properties": {}, + "DefaultProperties": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "LoadStringEnabled": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ServerStorage": { + "Name": "ServerStorage", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ServiceProvider": { + "Name": "ServiceProvider", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "SessionService": { + "Name": "SessionService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Shirt": { + "Name": "Shirt", + "Tags": [], + "Superclass": "Clothing", + "Properties": { + "ShirtTemplate": { + "Name": "ShirtTemplate", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "ShirtTemplate": { + "Type": "Content", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "Graphic": { + "Type": "Content", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "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": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 4 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "FormFactor": { + "Type": "Enum", + "Value": 1 + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Shape": { + "Type": "Enum", + "Value": 1 + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Steer": { + "Type": "Int32", + "Value": 0 + }, + "StickyWheels": { + "Type": "Bool", + "Value": true + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Throttle": { + "Type": "Int32", + "Value": 0 + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 3 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SkinColor": { + "Type": "Int32", + "Value": 226 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "MoonTextureId": { + "Name": "MoonTextureId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SkyboxBk": { + "Name": "SkyboxBk", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SkyboxDn": { + "Name": "SkyboxDn", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SkyboxFt": { + "Name": "SkyboxFt", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SkyboxLf": { + "Name": "SkyboxLf", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SkyboxRt": { + "Name": "SkyboxRt", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SkyboxUp": { + "Name": "SkyboxUp", + "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" + } + } + }, + "SunTextureId": { + "Name": "SunTextureId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CelestialBodiesShown": { + "Type": "Bool", + "Value": true + }, + "MoonAngularSize": { + "Type": "Float32", + "Value": 11.0 + }, + "MoonTextureId": { + "Type": "Content", + "Value": "rbxasset://sky/moon.jpg" + }, + "SkyboxBk": { + "Type": "Content", + "Value": "rbxasset://textures/sky/sky512_bk.tex" + }, + "SkyboxDn": { + "Type": "Content", + "Value": "rbxasset://textures/sky/sky512_dn.tex" + }, + "SkyboxFt": { + "Type": "Content", + "Value": "rbxasset://textures/sky/sky512_ft.tex" + }, + "SkyboxLf": { + "Type": "Content", + "Value": "rbxasset://textures/sky/sky512_lf.tex" + }, + "SkyboxRt": { + "Type": "Content", + "Value": "rbxasset://textures/sky/sky512_rt.tex" + }, + "SkyboxUp": { + "Type": "Content", + "Value": "rbxasset://textures/sky/sky512_up.tex" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "StarCount": { + "Type": "Int32", + "Value": 3000 + }, + "SunAngularSize": { + "Type": "Float32", + "Value": 21.0 + }, + "SunTextureId": { + "Type": "Content", + "Value": "rbxasset://sky/sun.jpg" + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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": {} + }, + "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" + } + } + }, + "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" + } + } + } + }, + "opacity_xml": { + "Name": "opacity_xml", + "Scriptability": "None", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Alias": { + "AliasFor": "Opacity" + } + } + }, + "riseVelocity_xml": { + "Name": "riseVelocity_xml", + "Scriptability": "None", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Alias": { + "AliasFor": "RiseVelocity" + } + } + }, + "size_xml": { + "Name": "size_xml", + "Scriptability": "None", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Alias": { + "AliasFor": "Size" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Opacity": { + "Type": "Float32", + "Value": 0.5 + }, + "RiseVelocity": { + "Type": "Float32", + "Value": 1.0 + }, + "Size": { + "Type": "Float32", + "Value": 1.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Snap": { + "Name": "Snap", + "Tags": [], + "Superclass": "JointInstance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "SocialService": { + "Name": "SocialService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "SolidModelContentProvider": { + "Name": "SolidModelContentProvider", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "CacheableContentProvider", + "Properties": {}, + "DefaultProperties": {} + }, + "Sound": { + "Name": "Sound", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "EmitterSize": { + "Name": "EmitterSize", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "Deprecated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "IsLoaded": { + "Name": "IsLoaded", + "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" + } + } + }, + "IsPlaying": { + "Name": "IsPlaying", + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "RollOffMaxDistance": { + "Name": "RollOffMaxDistance", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RollOffMinDistance": { + "Name": "RollOffMinDistance", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RollOffMode": { + "Name": "RollOffMode", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "RollOffMode" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SoundGroup": { + "Name": "SoundGroup", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SoundId": { + "Name": "SoundId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "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" + } + } + }, + "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": [], + "Kind": { + "Alias": { + "AliasFor": "MaxDistance" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "EmitterSize": { + "Type": "Float32", + "Value": 10.0 + }, + "Looped": { + "Type": "Bool", + "Value": false + }, + "MaxDistance": { + "Type": "Float32", + "Value": 10000.0 + }, + "PlayOnRemove": { + "Type": "Bool", + "Value": false + }, + "PlaybackSpeed": { + "Type": "Float32", + "Value": 1.0 + }, + "Playing": { + "Type": "Bool", + "Value": false + }, + "RollOffMode": { + "Type": "Enum", + "Value": 0 + }, + "SoundId": { + "Type": "Content", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TimePosition": { + "Type": "Float64", + "Value": 0.0 + }, + "Volume": { + "Type": "Float32", + "Value": 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": {} + }, + "SoundGroup": { + "Name": "SoundGroup", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "Volume": { + "Name": "Volume", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Volume": { + "Type": "Float32", + "Value": 0.5 + } + } + }, + "SoundService": { + "Name": "SoundService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "AmbientReverb": { + "Name": "AmbientReverb", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "ReverbType" + }, + "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" + } + } + }, + "RespectFilteringEnabled": { + "Name": "RespectFilteringEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "RolloffScale": { + "Name": "RolloffScale", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AmbientReverb": { + "Type": "Enum", + "Value": 0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "DistanceFactor": { + "Type": "Float32", + "Value": 3.33 + }, + "DopplerScale": { + "Type": "Float32", + "Value": 1.0 + }, + "RespectFilteringEnabled": { + "Type": "Bool", + "Value": false + }, + "RolloffScale": { + "Type": "Float32", + "Value": 1.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "SparkleColor": { + "Name": "SparkleColor", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "SparkleColor": { + "Type": "Color3", + "Value": [ + 0.5647059, + 0.098039225, + 1.0 + ] + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "Type": "Bool", + "Value": false + }, + "Anchored": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 4 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "Duration": { + "Type": "Int32", + "Value": 10 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "FormFactor": { + "Type": "Enum", + "Value": 1 + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Neutral": { + "Type": "Bool", + "Value": true + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Shape": { + "Type": "Enum", + "Value": 1 + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TeamColor": { + "Type": "Int32", + "Value": 194 + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 3 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "SpawnerService": { + "Name": "SpawnerService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "SpecialMesh": { + "Name": "SpecialMesh", + "Tags": [], + "Superclass": "FileMesh", + "Properties": { + "MeshType": { + "Name": "MeshType", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "MeshType" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "MeshId": { + "Type": "Content", + "Value": "" + }, + "MeshType": { + "Type": "Enum", + "Value": 0 + }, + "Offset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Scale": { + "Type": "Vector3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TextureId": { + "Type": "Content", + "Value": "" + }, + "VertexColor": { + "Type": "Vector3", + "Value": [ + 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" + } + } + } + }, + "DefaultProperties": { + "AdornCullingMode": { + "Type": "Enum", + "Value": 0 + }, + "AlwaysOnTop": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "Radius": { + "Type": "Float32", + "Value": 1.0 + }, + "SizeRelativeOffset": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": -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": { + "Type": "Float32", + "Value": 90.0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Brightness": { + "Type": "Float32", + "Value": 1.0 + }, + "Color": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Face": { + "Type": "Enum", + "Value": 5 + }, + "Range": { + "Type": "Float32", + "Value": 16.0 + }, + "Shadows": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Coils": { + "Type": "Float32", + "Value": 3.0 + }, + "Color": { + "Type": "Int32", + "Value": 200 + }, + "Damping": { + "Type": "Float32", + "Value": 0.0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "FreeLength": { + "Type": "Float32", + "Value": 1.0 + }, + "LimitsEnabled": { + "Type": "Bool", + "Value": false + }, + "MaxForce": { + "Type": "Float32", + "Value": null + }, + "MaxLength": { + "Type": "Float32", + "Value": 5.0 + }, + "MinLength": { + "Type": "Float32", + "Value": 0.0 + }, + "Radius": { + "Type": "Float32", + "Value": 0.4 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Stiffness": { + "Type": "Float32", + "Value": 0.0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Thickness": { + "Type": "Float32", + "Value": 0.1 + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "StandalonePluginScripts": { + "Name": "StandalonePluginScripts", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "StandardPages": { + "Name": "StandardPages", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Pages", + "Properties": {}, + "DefaultProperties": {} + }, + "StarterCharacterScripts": { + "Name": "StarterCharacterScripts", + "Tags": [ + "NotCreatable" + ], + "Superclass": "StarterPlayerScripts", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "StarterGear": { + "Name": "StarterGear", + "Tags": [], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "StarterGui": { + "Name": "StarterGui", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "BasePlayerGui", + "Properties": { + "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" + } + } + }, + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "ResetPlayerGuiOnSpawn": { + "Type": "Bool", + "Value": true + }, + "ScreenOrientation": { + "Type": "Enum", + "Value": 2 + }, + "ShowDevelopmentGui": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "StarterPack": { + "Name": "StarterPack", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "StarterPlayer": { + "Name": "StarterPlayer", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "AllowCustomAnimations": { + "Name": "AllowCustomAnimations", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "AutoJumpEnabled": { + "Name": "AutoJumpEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "EnableMouseLockOption": { + "Name": "EnableMouseLockOption", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDFace": { + "Name": "GameSettingsAssetIDFace", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDHead": { + "Name": "GameSettingsAssetIDHead", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDLeftArm": { + "Name": "GameSettingsAssetIDLeftArm", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDLeftLeg": { + "Name": "GameSettingsAssetIDLeftLeg", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDPants": { + "Name": "GameSettingsAssetIDPants", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDRightArm": { + "Name": "GameSettingsAssetIDRightArm", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDRightLeg": { + "Name": "GameSettingsAssetIDRightLeg", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDShirt": { + "Name": "GameSettingsAssetIDShirt", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDTeeShirt": { + "Name": "GameSettingsAssetIDTeeShirt", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDTorso": { + "Name": "GameSettingsAssetIDTorso", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAvatar": { + "Name": "GameSettingsAvatar", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "GameAvatarType" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsR15Collision": { + "Name": "GameSettingsR15Collision", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "R15CollisionType" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsScaleRangeBodyType": { + "Name": "GameSettingsScaleRangeBodyType", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "NumberRange" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsScaleRangeHead": { + "Name": "GameSettingsScaleRangeHead", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "NumberRange" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsScaleRangeHeight": { + "Name": "GameSettingsScaleRangeHeight", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "NumberRange" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsScaleRangeProportion": { + "Name": "GameSettingsScaleRangeProportion", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "NumberRange" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsScaleRangeWidth": { + "Name": "GameSettingsScaleRangeWidth", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "NumberRange" + }, + "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" + } + } + }, + "NameDisplayDistance": { + "Name": "NameDisplayDistance", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "UserEmotesEnabled": { + "Name": "UserEmotesEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AllowCustomAnimations": { + "Type": "Bool", + "Value": true + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoJumpEnabled": { + "Type": "Bool", + "Value": true + }, + "CameraMaxZoomDistance": { + "Type": "Float32", + "Value": 400.0 + }, + "CameraMinZoomDistance": { + "Type": "Float32", + "Value": 0.5 + }, + "CameraMode": { + "Type": "Enum", + "Value": 0 + }, + "CharacterJumpHeight": { + "Type": "Float32", + "Value": 7.2 + }, + "CharacterJumpPower": { + "Type": "Float32", + "Value": 50.0 + }, + "CharacterMaxSlopeAngle": { + "Type": "Float32", + "Value": 89.0 + }, + "CharacterUseJumpPower": { + "Type": "Bool", + "Value": true + }, + "CharacterWalkSpeed": { + "Type": "Float32", + "Value": 16.0 + }, + "DevCameraOcclusionMode": { + "Type": "Enum", + "Value": 0 + }, + "DevComputerCameraMovementMode": { + "Type": "Enum", + "Value": 0 + }, + "DevComputerMovementMode": { + "Type": "Enum", + "Value": 0 + }, + "DevTouchCameraMovementMode": { + "Type": "Enum", + "Value": 0 + }, + "DevTouchMovementMode": { + "Type": "Enum", + "Value": 0 + }, + "EnableMouseLockOption": { + "Type": "Bool", + "Value": true + }, + "GameSettingsAssetIDFace": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAssetIDHead": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAssetIDLeftArm": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAssetIDLeftLeg": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAssetIDPants": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAssetIDRightArm": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAssetIDRightLeg": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAssetIDShirt": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAssetIDTeeShirt": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAssetIDTorso": { + "Type": "Int64", + "Value": 0 + }, + "GameSettingsAvatar": { + "Type": "Enum", + "Value": 1 + }, + "GameSettingsR15Collision": { + "Type": "Enum", + "Value": 0 + }, + "GameSettingsScaleRangeBodyType": { + "Type": "NumberRange", + "Value": [ + 0.0, + 1.0 + ] + }, + "GameSettingsScaleRangeHead": { + "Type": "NumberRange", + "Value": [ + 0.95, + 1.0 + ] + }, + "GameSettingsScaleRangeHeight": { + "Type": "NumberRange", + "Value": [ + 0.9, + 1.05 + ] + }, + "GameSettingsScaleRangeProportion": { + "Type": "NumberRange", + "Value": [ + 0.0, + 1.0 + ] + }, + "GameSettingsScaleRangeWidth": { + "Type": "NumberRange", + "Value": [ + 0.7, + 1.0 + ] + }, + "HealthDisplayDistance": { + "Type": "Float32", + "Value": 100.0 + }, + "LoadCharacterAppearance": { + "Type": "Bool", + "Value": true + }, + "NameDisplayDistance": { + "Type": "Float32", + "Value": 100.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "UserEmotesEnabled": { + "Type": "Bool", + "Value": true + } + } + }, + "StarterPlayerScripts": { + "Name": "StarterPlayerScripts", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "HeartbeatTimeMs": { + "Name": "HeartbeatTimeMs", + "Scriptability": "Read", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "InstanceCount": { + "Name": "InstanceCount", + "Scriptability": "Read", + "DataType": { + "Value": "Int32" + }, + "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" + } + } + }, + "PhysicsStepTimeMs": { + "Name": "PhysicsStepTimeMs", + "Scriptability": "Read", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "PrimitivesCount": { + "Name": "PrimitivesCount", + "Scriptability": "Read", + "DataType": { + "Value": "Int32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "StatsItem": { + "Name": "StatsItem", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Status": { + "Name": "Status", + "Tags": [ + "Deprecated", + "NotCreatable" + ], + "Superclass": "Model", + "Properties": {}, + "DefaultProperties": {} + }, + "StopWatchReporter": { + "Name": "StopWatchReporter", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "StringValue": { + "Name": "StringValue", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "String", + "Value": "" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "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 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" + } + } + }, + "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 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 Zoom to Mouse Position": { + "Name": "Camera Zoom to Mouse Position", + "Scriptability": "ReadWrite", + "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" + } + } + }, + "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" + } + } + }, + "DeprecatedObjectsShown": { + "Name": "DeprecatedObjectsShown", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Disable Accurate Play Solo": { + "Name": "Disable Accurate Play Solo", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "DisplayLanguage": { + "Name": "DisplayLanguage", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Drag Multiple Parts As Single Part": { + "Name": "Drag Multiple Parts As Single Part", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Enable Autocomplete": { + "Name": "Enable Autocomplete", + "Scriptability": "ReadWrite", + "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 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" + } + } + }, + "Error Color": { + "Name": "Error Color", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "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" + } + } + }, + "Hover Animate Speed": { + "Name": "Hover Animate Speed", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "HoverAnimateSpeed" + }, + "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" + } + } + }, + "Keyword Color": { + "Name": "Keyword Color", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Language": { + "Name": "Language", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "LanguagePreference" + }, + "Tags": [ + "Deprecated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Line Thickness": { + "Name": "Line Thickness", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "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" + } + } + }, + "Matching Word Background Color": { + "Name": "Matching Word Background Color", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Maximum Output Lines": { + "Name": "Maximum Output Lines", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "OverrideCoreScripts": { + "Name": "OverrideCoreScripts", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PermissionLevelShown": { + "Name": "PermissionLevelShown", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "PermissionLevelShown" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PluginDebuggingEnabled": { + "Name": "PluginDebuggingEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Property Color": { + "Name": "Property Color", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Render Throttle Percentage": { + "Name": "Render Throttle Percentage", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "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" + } + } + }, + "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" + } + } + }, + "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" + } + } + }, + "Search Content For Core Scripts": { + "Name": "Search Content For Core Scripts", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "Selection Background Color": { + "Name": "Selection Background Color", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Selection Color": { + "Name": "Selection Color", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Server Audio Behavior": { + "Name": "Server Audio Behavior", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "ServerAudioBehavior" + }, + "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 CorePackages": { + "Name": "Show CorePackages", + "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 Navigation Mesh": { + "Name": "Show Navigation Mesh", + "Scriptability": "ReadWrite", + "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 QT warnings in output": { + "Name": "Show QT warnings in output", + "Scriptability": "ReadWrite", + "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" + } + } + }, + "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" + } + } + }, + "UI Theme": { + "Name": "UI Theme", + "Scriptability": "Read", + "DataType": { + "Enum": "UITheme" + }, + "Tags": [ + "Deprecated", + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "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" + } + } + } + }, + "DefaultProperties": {} + }, + "StudioData": { + "Name": "StudioData", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "EnableScriptCollabByDefaultOnLoad": { + "Name": "EnableScriptCollabByDefaultOnLoad", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "EnableScriptCollabOnLoad": { + "Name": "EnableScriptCollabOnLoad", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SrcPlaceId": { + "Name": "SrcPlaceId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SrcUniverseId": { + "Name": "SrcUniverseId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "EnableScriptCollabByDefaultOnLoad": { + "Type": "Bool", + "Value": false + }, + "EnableScriptCollabOnLoad": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "SrcPlaceId": { + "Type": "Int64", + "Value": 0 + }, + "SrcUniverseId": { + "Type": "Int64", + "Value": 0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "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": [ + "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": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "InstalledPluginData": { + "Name": "InstalledPluginData", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RotateIncrement": { + "Name": "RotateIncrement", + "Scriptability": "Read", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "ShowActiveInstanceHighlight": { + "Name": "ShowActiveInstanceHighlight", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "ShowConstraintDetails": { + "Name": "ShowConstraintDetails", + "Scriptability": "Read", + "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": {} + }, + "StudioTheme": { + "Name": "StudioTheme", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Intensity": { + "Type": "Float32", + "Value": 0.25 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Spread": { + "Type": "Float32", + "Value": 1.0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "SurfaceAppearance": { + "Name": "SurfaceAppearance", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "AlphaMode": { + "Name": "AlphaMode", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "AlphaMode" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ColorMap": { + "Name": "ColorMap", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MetalnessMap": { + "Name": "MetalnessMap", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "NormalMap": { + "Name": "NormalMap", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "RoughnessMap": { + "Name": "RoughnessMap", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TexturePack": { + "Name": "TexturePack", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AlphaMode": { + "Type": "Enum", + "Value": 0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "ColorMap": { + "Type": "Content", + "Value": "" + }, + "MetalnessMap": { + "Type": "Content", + "Value": "" + }, + "NormalMap": { + "Type": "Content", + "Value": "" + }, + "RoughnessMap": { + "Type": "Content", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TexturePack": { + "Type": "Content", + "Value": "" + } + } + }, + "SurfaceGui": { + "Name": "SurfaceGui", + "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" + } + } + }, + "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" + } + } + }, + "Face": { + "Name": "Face", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "NormalId" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "LightInfluence": { + "Name": "LightInfluence", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PixelsPerStud": { + "Name": "PixelsPerStud", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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": { + "Type": "Bool", + "Value": true + }, + "AlwaysOnTop": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "CanvasSize": { + "Type": "Vector2", + "Value": [ + 800.0, + 600.0 + ] + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Face": { + "Type": "Enum", + "Value": 5 + }, + "LightInfluence": { + "Type": "Float32", + "Value": 0.0 + }, + "PixelsPerStud": { + "Type": "Float32", + "Value": 50.0 + }, + "ResetOnSpawn": { + "Type": "Bool", + "Value": true + }, + "SizingMode": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "ToolPunchThroughDistance": { + "Type": "Float32", + "Value": 0.0 + }, + "ZIndexBehavior": { + "Type": "Enum", + "Value": 0 + }, + "ZOffset": { + "Type": "Float32", + "Value": 0.0 + } + } + }, + "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": { + "Type": "Float32", + "Value": 90.0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Brightness": { + "Type": "Float32", + "Value": 1.0 + }, + "Color": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Face": { + "Type": "Enum", + "Value": 5 + }, + "Range": { + "Type": "Float32", + "Value": 16.0 + }, + "Shadows": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "SurfaceSelection": { + "Name": "SurfaceSelection", + "Tags": [], + "Superclass": "PartAdornment", + "Properties": { + "TargetSurface": { + "Name": "TargetSurface", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "NormalId" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 0.050980397, + 0.41176474, + 0.6745098 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TargetSurface": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Visible": { + "Type": "Bool", + "Value": true + } + } + }, + "TaskScheduler": { + "Name": "TaskScheduler", + "Tags": [ + "NotCreatable", + "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": {} + }, + "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": "ReadWrite", + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoAssignable": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TeamColor": { + "Type": "Int32", + "Value": 1 + } + } + }, + "Teams": { + "Name": "Teams", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": {} + }, + "TeleportOptions": { + "Name": "TeleportOptions", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "ReservedServerAccessCode": { + "Name": "ReservedServerAccessCode", + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "ReservedServerAccessCode": { + "Type": "String", + "Value": "" + }, + "ServerInstanceId": { + "Type": "String", + "Value": "" + }, + "ShouldReserveServer": { + "Type": "Bool", + "Value": false + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Terrain": { + "Name": "Terrain", + "Tags": [ + "NotCreatable" + ], + "Superclass": "BasePart", + "Properties": { + "Decoration": { + "Name": "Decoration", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "IsSmooth": { + "Name": "IsSmooth", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Deprecated", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "MaterialColors": { + "Name": "MaterialColors", + "Scriptability": "None", + "DataType": { + "Value": "BinaryString" + }, + "Tags": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MaxExtents": { + "Name": "MaxExtents", + "Scriptability": "Read", + "DataType": { + "Value": "Region3int16" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "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": { + "Anchored": { + "Type": "Bool", + "Value": true + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 4 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "Decoration": { + "Type": "Bool", + "Value": false + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": true + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "MaterialColors": { + "Type": "BinaryString", + "Value": "AAAAAAAAan8/P39rf2Y/ilY+j35fi21PZmxvZbDqw8faiVpHOi4kHh4lZlw76JxKc3trhHtagcLgc4RKxr21zq2UlJSM" + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 2044.0, + 252.0, + 2044.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 3 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "WaterColor": { + "Type": "Color3", + "Value": [ + 0.05, + 0.33, + 0.36 + ] + }, + "WaterReflectance": { + "Type": "Float32", + "Value": 1.0 + }, + "WaterTransparency": { + "Type": "Float32", + "Value": 0.3 + }, + "WaterWaveSize": { + "Type": "Float32", + "Value": 0.15 + }, + "WaterWaveSpeed": { + "Type": "Float32", + "Value": 10.0 + } + } + }, + "TerrainRegion": { + "Name": "TerrainRegion", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "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" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoRuns": { + "Type": "Bool", + "Value": true + }, + "Description": { + "Type": "String", + "Value": "" + }, + "ExecuteWithStudioRun": { + "Type": "Bool", + "Value": false + }, + "Is30FpsThrottleEnabled": { + "Type": "Bool", + "Value": true + }, + "IsPhysicsEnvironmentalThrottled": { + "Type": "Bool", + "Value": true + }, + "IsSleepAllowed": { + "Type": "Bool", + "Value": true + }, + "NumberOfPlayers": { + "Type": "Int32", + "Value": 0 + }, + "SimulateSecondsLag": { + "Type": "Float64", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Timeout": { + "Type": "Float64", + "Value": 10.0 + } + } + }, + "TextBox": { + "Name": "TextBox", + "Tags": [], + "Superclass": "GuiObject", + "Properties": { + "ClearTextOnFocus": { + "Name": "ClearTextOnFocus", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Content": { + "Name": "Content", + "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" + } + } + }, + "EnableRealtimeFilteringHints": { + "Name": "EnableRealtimeFilteringHints", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Font": { + "Name": "Font", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "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" + } + } + }, + "ManualFocusRelease": { + "Name": "ManualFocusRelease", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "MultiLine": { + "Name": "MultiLine", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "OverlayNativeInput": { + "Name": "OverlayNativeInput", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "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": "ReadWrite", + "DataType": { + "Enum": "ReturnKeyType" + }, + "Tags": [ + "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" + } + } + }, + "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" + } + } + }, + "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": "ReadWrite", + "DataType": { + "Enum": "TextInputType" + }, + "Tags": [ + "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": { + "Type": "Bool", + "Value": true + }, + "AnchorPoint": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "AutomaticSize": { + "Type": "Enum", + "Value": 0 + }, + "BackgroundColor3": { + "Type": "Color3", + "Value": [ + 0.6392157, + 0.63529414, + 0.64705884 + ] + }, + "BackgroundTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "BorderColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "BorderMode": { + "Type": "Enum", + "Value": 0 + }, + "BorderSizePixel": { + "Type": "Int32", + "Value": 1 + }, + "ClearTextOnFocus": { + "Type": "Bool", + "Value": true + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "Draggable": { + "Type": "Bool", + "Value": false + }, + "Font": { + "Type": "Enum", + "Value": 0 + }, + "LayoutOrder": { + "Type": "Int32", + "Value": 0 + }, + "LineHeight": { + "Type": "Float32", + "Value": 1.0 + }, + "MultiLine": { + "Type": "Bool", + "Value": false + }, + "PlaceholderColor3": { + "Type": "Color3", + "Value": [ + 0.7, + 0.7, + 0.7 + ] + }, + "PlaceholderText": { + "Type": "String", + "Value": "" + }, + "Position": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "RichText": { + "Type": "Bool", + "Value": false + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "Selectable": { + "Type": "Bool", + "Value": true + }, + "ShowNativeInput": { + "Type": "Bool", + "Value": true + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeConstraint": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Text": { + "Type": "String", + "Value": "TextBox" + }, + "TextColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "TextEditable": { + "Type": "Bool", + "Value": true + }, + "TextScaled": { + "Type": "Bool", + "Value": false + }, + "TextSize": { + "Type": "Float32", + "Value": 8.0 + }, + "TextStrokeColor3": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "TextStrokeTransparency": { + "Type": "Float32", + "Value": 1.0 + }, + "TextTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "TextTruncate": { + "Type": "Enum", + "Value": 0 + }, + "TextWrapped": { + "Type": "Bool", + "Value": false + }, + "TextXAlignment": { + "Type": "Enum", + "Value": 2 + }, + "TextYAlignment": { + "Type": "Enum", + "Value": 1 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": 1 + } + } + }, + "TextButton": { + "Name": "TextButton", + "Tags": [], + "Superclass": "GuiButton", + "Properties": { + "Content": { + "Name": "Content", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Font": { + "Name": "Font", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "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" + } + } + }, + "LocalizedText": { + "Name": "LocalizedText", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Hidden", + "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" + } + } + }, + "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": { + "Type": "Bool", + "Value": true + }, + "AnchorPoint": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoButtonColor": { + "Type": "Bool", + "Value": true + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "AutomaticSize": { + "Type": "Enum", + "Value": 0 + }, + "BackgroundColor3": { + "Type": "Color3", + "Value": [ + 0.6392157, + 0.63529414, + 0.64705884 + ] + }, + "BackgroundTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "BorderColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "BorderMode": { + "Type": "Enum", + "Value": 0 + }, + "BorderSizePixel": { + "Type": "Int32", + "Value": 1 + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "Draggable": { + "Type": "Bool", + "Value": false + }, + "Font": { + "Type": "Enum", + "Value": 0 + }, + "LayoutOrder": { + "Type": "Int32", + "Value": 0 + }, + "LineHeight": { + "Type": "Float32", + "Value": 1.0 + }, + "Modal": { + "Type": "Bool", + "Value": false + }, + "Position": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "RichText": { + "Type": "Bool", + "Value": false + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "Selectable": { + "Type": "Bool", + "Value": true + }, + "Selected": { + "Type": "Bool", + "Value": false + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeConstraint": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Style": { + "Type": "Enum", + "Value": 0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Text": { + "Type": "String", + "Value": "Button" + }, + "TextColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "TextScaled": { + "Type": "Bool", + "Value": false + }, + "TextSize": { + "Type": "Float32", + "Value": 8.0 + }, + "TextStrokeColor3": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "TextStrokeTransparency": { + "Type": "Float32", + "Value": 1.0 + }, + "TextTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "TextTruncate": { + "Type": "Enum", + "Value": 0 + }, + "TextWrapped": { + "Type": "Bool", + "Value": false + }, + "TextXAlignment": { + "Type": "Enum", + "Value": 2 + }, + "TextYAlignment": { + "Type": "Enum", + "Value": 1 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": 1 + } + } + }, + "TextFilterResult": { + "Name": "TextFilterResult", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "TextLabel": { + "Name": "TextLabel", + "Tags": [], + "Superclass": "GuiLabel", + "Properties": { + "Content": { + "Name": "Content", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Font": { + "Name": "Font", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "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" + } + } + }, + "LocalizedText": { + "Name": "LocalizedText", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Hidden", + "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" + } + } + }, + "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": { + "Type": "Bool", + "Value": false + }, + "AnchorPoint": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "AutomaticSize": { + "Type": "Enum", + "Value": 0 + }, + "BackgroundColor3": { + "Type": "Color3", + "Value": [ + 0.6392157, + 0.63529414, + 0.64705884 + ] + }, + "BackgroundTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "BorderColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "BorderMode": { + "Type": "Enum", + "Value": 0 + }, + "BorderSizePixel": { + "Type": "Int32", + "Value": 1 + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "Draggable": { + "Type": "Bool", + "Value": false + }, + "Font": { + "Type": "Enum", + "Value": 0 + }, + "LayoutOrder": { + "Type": "Int32", + "Value": 0 + }, + "LineHeight": { + "Type": "Float32", + "Value": 1.0 + }, + "Position": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "RichText": { + "Type": "Bool", + "Value": false + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "Selectable": { + "Type": "Bool", + "Value": false + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeConstraint": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Text": { + "Type": "String", + "Value": "Label" + }, + "TextColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "TextScaled": { + "Type": "Bool", + "Value": false + }, + "TextSize": { + "Type": "Float32", + "Value": 8.0 + }, + "TextStrokeColor3": { + "Type": "Color3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "TextStrokeTransparency": { + "Type": "Float32", + "Value": 1.0 + }, + "TextTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "TextTruncate": { + "Type": "Enum", + "Value": 0 + }, + "TextWrapped": { + "Type": "Bool", + "Value": false + }, + "TextXAlignment": { + "Type": "Enum", + "Value": 2 + }, + "TextYAlignment": { + "Type": "Enum", + "Value": 1 + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": 1 + } + } + }, + "TextService": { + "Name": "TextService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color3": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "Face": { + "Type": "Enum", + "Value": 5 + }, + "OffsetStudsU": { + "Type": "Float32", + "Value": 0.0 + }, + "OffsetStudsV": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "StudsPerTileU": { + "Type": "Float32", + "Value": 2.0 + }, + "StudsPerTileV": { + "Type": "Float32", + "Value": 2.0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Texture": { + "Type": "Content", + "Value": "" + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + } + } + }, + "ThirdPartyUserService": { + "Name": "ThirdPartyUserService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "TimerService": { + "Name": "TimerService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "GripPos": { + "Name": "GripPos", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "GripRight": { + "Name": "GripRight", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "GripUp": { + "Name": "GripUp", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CanBeDropped": { + "Type": "Bool", + "Value": true + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Grip": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "ManualActivationOnly": { + "Type": "Bool", + "Value": false + }, + "RequiresHandle": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TextureId": { + "Type": "Content", + "Value": "" + }, + "ToolTip": { + "Type": "String", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 23 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "RelativeTo": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Torque": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "TotalCountTimeIntervalItem": { + "Name": "TotalCountTimeIntervalItem", + "Tags": [ + "NotCreatable" + ], + "Superclass": "StatsItem", + "Properties": {}, + "DefaultProperties": {} + }, + "TouchInputService": { + "Name": "TouchInputService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "TouchTransmitter": { + "Name": "TouchTransmitter", + "Tags": [ + "NotBrowsable", + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "TracerService": { + "Name": "TracerService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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" + } + } + }, + "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" + } + } + }, + "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": "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "ColorSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Color": [ + 1.0, + 1.0, + 1.0 + ] + }, + { + "Time": 1.0, + "Color": [ + 1.0, + 1.0, + 1.0 + ] + } + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "FaceCamera": { + "Type": "Bool", + "Value": false + }, + "Lifetime": { + "Type": "Float32", + "Value": 2.0 + }, + "LightEmission": { + "Type": "Float32", + "Value": 0.0 + }, + "LightInfluence": { + "Type": "Float32", + "Value": 0.0 + }, + "MaxLength": { + "Type": "Float32", + "Value": 0.0 + }, + "MinLength": { + "Type": "Float32", + "Value": 0.1 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Texture": { + "Type": "Content", + "Value": "" + }, + "TextureLength": { + "Type": "Float32", + "Value": 1.0 + }, + "TextureMode": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "NumberSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Value": 0.5, + "Envelope": 0.0 + }, + { + "Time": 1.0, + "Value": 0.5, + "Envelope": 0.0 + } + ] + } + }, + "WidthScale": { + "Type": "NumberSequence", + "Value": { + "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": {} + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Depth": { + "Type": "Float32", + "Value": 1.0 + }, + "Duty": { + "Type": "Float32", + "Value": 0.5 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Frequency": { + "Type": "Float32", + "Value": 5.0 + }, + "Priority": { + "Type": "Int32", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "TriangleMeshPart": { + "Name": "TriangleMeshPart", + "Tags": [ + "NotCreatable" + ], + "Superclass": "BasePart", + "Properties": { + "CollisionFidelity": { + "Name": "CollisionFidelity", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "CollisionFidelity" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} + }, + "TrussPart": { + "Name": "TrussPart", + "Tags": [], + "Superclass": "BasePart", + "Properties": { + "Style": { + "Name": "Style", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "Style" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "Anchored": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 5 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 5 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 5 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 5 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 5 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 2.0, + 2.0, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 5 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "Tween": { + "Name": "Tween", + "Tags": [], + "Superclass": "TweenBase", + "Properties": { + "Instance": { + "Name": "Instance", + "Scriptability": "Read", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": {} + }, + "TweenService": { + "Name": "TweenService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "UGCValidationService": { + "Name": "UGCValidationService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "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": { + "AspectRatio": { + "Type": "Float32", + "Value": 1.0 + }, + "AspectType": { + "Type": "Enum", + "Value": 0 + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "DominantAxis": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "UIBase": { + "Name": "UIBase", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "UIComponent": { + "Name": "UIComponent", + "Tags": [ + "NotCreatable" + ], + "Superclass": "UIBase", + "Properties": {}, + "DefaultProperties": {} + }, + "UIConstraint": { + "Name": "UIConstraint", + "Tags": [ + "NotCreatable" + ], + "Superclass": "UIComponent", + "Properties": {}, + "DefaultProperties": {} + }, + "UICorner": { + "Name": "UICorner", + "Tags": [], + "Superclass": "UIComponent", + "Properties": { + "CornerRadius": { + "Name": "CornerRadius", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "UDim" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CornerRadius": { + "Type": "UDim", + "Value": [ + 0.0, + 8 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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" + } + } + }, + "Transparency": { + "Name": "Transparency", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "NumberSequence" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "ColorSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Color": [ + 1.0, + 1.0, + 1.0 + ] + }, + { + "Time": 1.0, + "Color": [ + 1.0, + 1.0, + 1.0 + ] + } + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Offset": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Transparency": { + "Type": "NumberSequence", + "Value": { + "Keypoints": [ + { + "Time": 0.0, + "Value": 0.0, + "Envelope": 0.0 + }, + { + "Time": 1.0, + "Value": 0.0, + "Envelope": 0.0 + } + ] + } + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CellPadding": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 5 + ], + [ + 0.0, + 5 + ] + ] + }, + "CellSize": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 100 + ], + [ + 0.0, + 100 + ] + ] + }, + "FillDirection": { + "Type": "Enum", + "Value": 0 + }, + "FillDirectionMaxCells": { + "Type": "Int32", + "Value": 0 + }, + "HorizontalAlignment": { + "Type": "Enum", + "Value": 1 + }, + "SortOrder": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "StartCorner": { + "Type": "Enum", + "Value": 0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "VerticalAlignment": { + "Type": "Enum", + "Value": 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": {} + }, + "UILayout": { + "Name": "UILayout", + "Tags": [ + "NotCreatable" + ], + "Superclass": "UIComponent", + "Properties": {}, + "DefaultProperties": {} + }, + "UIListLayout": { + "Name": "UIListLayout", + "Tags": [], + "Superclass": "UIGridStyleLayout", + "Properties": { + "Padding": { + "Name": "Padding", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "UDim" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "FillDirection": { + "Type": "Enum", + "Value": 1 + }, + "HorizontalAlignment": { + "Type": "Enum", + "Value": 1 + }, + "Padding": { + "Type": "UDim", + "Value": [ + 0.0, + 0 + ] + }, + "SortOrder": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "VerticalAlignment": { + "Type": "Enum", + "Value": 1 + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "PaddingBottom": { + "Type": "UDim", + "Value": [ + 0.0, + 0 + ] + }, + "PaddingLeft": { + "Type": "UDim", + "Value": [ + 0.0, + 0 + ] + }, + "PaddingRight": { + "Type": "UDim", + "Value": [ + 0.0, + 0 + ] + }, + "PaddingTop": { + "Type": "UDim", + "Value": [ + 0.0, + 0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "Type": "Bool", + "Value": true + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Circular": { + "Type": "Bool", + "Value": false + }, + "EasingDirection": { + "Type": "Enum", + "Value": 1 + }, + "EasingStyle": { + "Type": "Enum", + "Value": 2 + }, + "FillDirection": { + "Type": "Enum", + "Value": 0 + }, + "GamepadInputEnabled": { + "Type": "Bool", + "Value": true + }, + "HorizontalAlignment": { + "Type": "Enum", + "Value": 1 + }, + "Padding": { + "Type": "UDim", + "Value": [ + 0.0, + 0 + ] + }, + "ScrollWheelInputEnabled": { + "Type": "Bool", + "Value": true + }, + "SortOrder": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TouchInputEnabled": { + "Type": "Bool", + "Value": true + }, + "TweenTime": { + "Type": "Float32", + "Value": 1.0 + }, + "VerticalAlignment": { + "Type": "Enum", + "Value": 1 + } + } + }, + "UIScale": { + "Name": "UIScale", + "Tags": [], + "Superclass": "UIComponent", + "Properties": { + "Scale": { + "Name": "Scale", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Scale": { + "Type": "Float32", + "Value": 1.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "MaxSize": { + "Type": "Vector2", + "Value": [ + null, + null + ] + }, + "MinSize": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "FillDirection": { + "Type": "Enum", + "Value": 1 + }, + "FillEmptySpaceColumns": { + "Type": "Bool", + "Value": false + }, + "FillEmptySpaceRows": { + "Type": "Bool", + "Value": false + }, + "HorizontalAlignment": { + "Type": "Enum", + "Value": 1 + }, + "MajorAxis": { + "Type": "Enum", + "Value": 0 + }, + "Padding": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SortOrder": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "VerticalAlignment": { + "Type": "Enum", + "Value": 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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "MaxTextSize": { + "Type": "Int32", + "Value": 100 + }, + "MinTextSize": { + "Type": "Int32", + "Value": 1 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "UnionOperation": { + "Name": "UnionOperation", + "Tags": [], + "Superclass": "PartOperation", + "Properties": {}, + "DefaultProperties": { + "Anchored": { + "Type": "Bool", + "Value": false + }, + "AssetId": { + "Type": "Content", + "Value": "" + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 0 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 255, + 255, + 255 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RenderFidelity": { + "Type": "Enum", + "Value": 1 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SmoothingAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 0 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "UsePartColor": { + "Type": "Bool", + "Value": false + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 1009 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "LimitsEnabled": { + "Type": "Bool", + "Value": false + }, + "MaxAngle": { + "Type": "Float32", + "Value": 45.0 + }, + "Radius": { + "Type": "Float32", + "Value": 0.2 + }, + "Restitution": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "UnvalidatedAssetService": { + "Name": "UnvalidatedAssetService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "UserGameSettings": { + "Name": "UserGameSettings", + "Tags": [ + "NotCreatable", + "UserSettings" + ], + "Superclass": "Instance", + "Properties": { + "AllTutorialsDisabled": { + "Name": "AllTutorialsDisabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "CameraMode": { + "Name": "CameraMode", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "CustomCameraMode" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "CameraYInverted": { + "Name": "CameraYInverted", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ChatVisible": { + "Name": "ChatVisible", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ComputerCameraMovementMode": { + "Name": "ComputerCameraMovementMode", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "ComputerCameraMovementMode" + }, + "Tags": [], + "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" + } + } + }, + "Fullscreen": { + "Name": "Fullscreen", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GamepadCameraSensitivity": { + "Name": "GamepadCameraSensitivity", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GraphicsQualityLevel": { + "Name": "GraphicsQualityLevel", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "HasEverUsedVR": { + "Name": "HasEverUsedVR", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "IsUsingCameraYInverted": { + "Name": "IsUsingCameraYInverted", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "IsUsingGamepadCameraSensitivity": { + "Name": "IsUsingGamepadCameraSensitivity", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "MasterVolume": { + "Name": "MasterVolume", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MicroProfilerWebServerEnabled": { + "Name": "MicroProfilerWebServerEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MicroProfilerWebServerIP": { + "Name": "MicroProfilerWebServerIP", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "MicroProfilerWebServerPort": { + "Name": "MicroProfilerWebServerPort", + "Scriptability": "Read", + "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": "ReadWrite", + "DataType": { + "Value": "Vector2" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MouseSensitivityThirdPerson": { + "Name": "MouseSensitivityThirdPerson", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector2" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "OnScreenProfilerEnabled": { + "Name": "OnScreenProfilerEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "OnboardingsCompleted": { + "Name": "OnboardingsCompleted", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "PerformanceStatsVisible": { + "Name": "PerformanceStatsVisible", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "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" + } + } + }, + "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" + } + } + }, + "TouchCameraMovementMode": { + "Name": "TouchCameraMovementMode", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "TouchCameraMovementMode" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TouchMovementMode": { + "Name": "TouchMovementMode", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "TouchMovementMode" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "UsedCoreGuiIsVisibleToggle": { + "Name": "UsedCoreGuiIsVisibleToggle", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "UsedCustomGuiIsVisibleToggle": { + "Name": "UsedCustomGuiIsVisibleToggle", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "UsedHideHudShortcut": { + "Name": "UsedHideHudShortcut", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "VREnabled": { + "Name": "VREnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "VRRotationIntensity": { + "Name": "VRRotationIntensity", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "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": "Read", + "DataType": { + "Value": "Vector2" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "GamepadEnabled": { + "Name": "GamepadEnabled", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "GazeSelectionEnabled": { + "Name": "GazeSelectionEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "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": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ModalEnabled": { + "Name": "ModalEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "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" + } + } + }, + "MouseIconEnabled": { + "Name": "MouseIconEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "NavBarSize": { + "Name": "NavBarSize", + "Scriptability": "Read", + "DataType": { + "Value": "Vector2" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "OnScreenKeyboardAnimationDuration": { + "Name": "OnScreenKeyboardAnimationDuration", + "Scriptability": "Read", + "DataType": { + "Value": "Float64" + }, + "Tags": [ + "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": "ReadWrite", + "DataType": { + "Enum": "OverrideMouseIconBehavior" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RightBarSize": { + "Name": "RightBarSize", + "Scriptability": "Read", + "DataType": { + "Value": "Vector2" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "StatusBarSize": { + "Name": "StatusBarSize", + "Scriptability": "Read", + "DataType": { + "Value": "Vector2" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "TouchEnabled": { + "Name": "TouchEnabled", + "Scriptability": "Read", + "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": {} + }, + "UserService": { + "Name": "UserService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "UserSettings": { + "Name": "UserSettings", + "Tags": [ + "NotCreatable" + ], + "Superclass": "GenericSettings", + "Properties": {}, + "DefaultProperties": {} + }, + "UserStorageService": { + "Name": "UserStorageService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "LocalStorageService", + "Properties": {}, + "DefaultProperties": {} + }, + "VRService": { + "Name": "VRService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": { + "GuiInputUserCFrame": { + "Name": "GuiInputUserCFrame", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "UserCFrame" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "VRDeviceName": { + "Name": "VRDeviceName", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "VREnabled": { + "Name": "VREnabled", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "ValueBase": { + "Name": "ValueBase", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Vector3Value": { + "Name": "Vector3Value", + "Tags": [], + "Superclass": "ValueBase", + "Properties": { + "Value": { + "Name": "Value", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Vector3" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Value": { + "Type": "Vector3", + "Value": [ + 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": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Color": { + "Type": "Int32", + "Value": 23 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "Force": { + "Type": "Vector3", + "Value": [ + 1000.0, + 0.0, + 0.0 + ] + }, + "RelativeTo": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": false + } + } + }, + "VehicleController": { + "Name": "VehicleController", + "Tags": [], + "Superclass": "Controller", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": [], + "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": [], + "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": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 4 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "Disabled": { + "Type": "Bool", + "Value": false + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "HeadsUpDisplay": { + "Type": "Bool", + "Value": true + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "MaxSpeed": { + "Type": "Float32", + "Value": 25.0 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Steer": { + "Type": "Int32", + "Value": 0 + }, + "SteerFloat": { + "Type": "Float32", + "Value": 0.0 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Throttle": { + "Type": "Int32", + "Value": 0 + }, + "ThrottleFloat": { + "Type": "Float32", + "Value": 0.0 + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 3 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Torque": { + "Type": "Float32", + "Value": 10.0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "TurnSpeed": { + "Type": "Float32", + "Value": 1.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 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": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "CurrentAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "DesiredAngle": { + "Type": "Float32", + "Value": 0.0 + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "MaxVelocity": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "VersionControlService": { + "Name": "VersionControlService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "VideoFrame": { + "Name": "VideoFrame", + "Tags": [], + "Superclass": "GuiObject", + "Properties": { + "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" + } + } + }, + "Playing": { + "Name": "Playing", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Video": { + "Name": "Video", + "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": { + "Type": "Bool", + "Value": false + }, + "AnchorPoint": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "AutomaticSize": { + "Type": "Enum", + "Value": 0 + }, + "BackgroundColor3": { + "Type": "Color3", + "Value": [ + 0.6392157, + 0.63529414, + 0.64705884 + ] + }, + "BackgroundTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "BorderColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "BorderMode": { + "Type": "Enum", + "Value": 0 + }, + "BorderSizePixel": { + "Type": "Int32", + "Value": 1 + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "Draggable": { + "Type": "Bool", + "Value": false + }, + "LayoutOrder": { + "Type": "Int32", + "Value": 0 + }, + "Looped": { + "Type": "Bool", + "Value": false + }, + "Playing": { + "Type": "Bool", + "Value": false + }, + "Position": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "Selectable": { + "Type": "Bool", + "Value": false + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeConstraint": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TimePosition": { + "Type": "Float64", + "Value": 0.0 + }, + "Video": { + "Type": "Content", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "Volume": { + "Type": "Float32", + "Value": 1.0 + }, + "ZIndex": { + "Type": "Int32", + "Value": 1 + } + } + }, + "ViewportFrame": { + "Name": "ViewportFrame", + "Tags": [], + "Superclass": "GuiObject", + "Properties": { + "Ambient": { + "Name": "Ambient", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Color3" + }, + "Tags": [], + "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" + } + } + }, + "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": { + "Type": "Bool", + "Value": false + }, + "Ambient": { + "Type": "Color3", + "Value": [ + 0.78431374, + 0.78431374, + 0.78431374 + ] + }, + "AnchorPoint": { + "Type": "Vector2", + "Value": [ + 0.0, + 0.0 + ] + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "AutoLocalize": { + "Type": "Bool", + "Value": true + }, + "AutomaticSize": { + "Type": "Enum", + "Value": 0 + }, + "BackgroundColor3": { + "Type": "Color3", + "Value": [ + 0.6392157, + 0.63529414, + 0.64705884 + ] + }, + "BackgroundTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "BorderColor3": { + "Type": "Color3", + "Value": [ + 0.10588236, + 0.16470589, + 0.20784315 + ] + }, + "BorderMode": { + "Type": "Enum", + "Value": 0 + }, + "BorderSizePixel": { + "Type": "Int32", + "Value": 1 + }, + "ClipsDescendants": { + "Type": "Bool", + "Value": false + }, + "Draggable": { + "Type": "Bool", + "Value": false + }, + "ImageColor3": { + "Type": "Color3", + "Value": [ + 1.0, + 1.0, + 1.0 + ] + }, + "ImageTransparency": { + "Type": "Float32", + "Value": 0.0 + }, + "LayoutOrder": { + "Type": "Int32", + "Value": 0 + }, + "LightColor": { + "Type": "Color3", + "Value": [ + 0.54901963, + 0.54901963, + 0.54901963 + ] + }, + "LightDirection": { + "Type": "Vector3", + "Value": [ + -1.0, + -1.0, + -1.0 + ] + }, + "Position": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "Rotation": { + "Type": "Float32", + "Value": 0.0 + }, + "Selectable": { + "Type": "Bool", + "Value": false + }, + "Size": { + "Type": "UDim2", + "Value": [ + [ + 0.0, + 0 + ], + [ + 0.0, + 0 + ] + ] + }, + "SizeConstraint": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "Visible": { + "Type": "Bool", + "Value": true + }, + "ZIndex": { + "Type": "Int32", + "Value": 1 + } + } + }, + "VirtualInputManager": { + "Name": "VirtualInputManager", + "Tags": [ + "Service" + ], + "Superclass": "Instance", + "Properties": { + "AdditionalLuaState": { + "Name": "AdditionalLuaState", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "VirtualUser": { + "Name": "VirtualUser", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "Visit": { + "Name": "Visit", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, + "WedgePart": { + "Name": "WedgePart", + "Tags": [], + "Superclass": "FormFactorPart", + "Properties": {}, + "DefaultProperties": { + "Anchored": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BackParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BackParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BackSurface": { + "Type": "Enum", + "Value": 0 + }, + "BackSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "BottomParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "BottomParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "BottomSurface": { + "Type": "Enum", + "Value": 4 + }, + "BottomSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "CFrame": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Bool", + "Value": true + }, + "CanTouch": { + "Type": "Bool", + "Value": true + }, + "CastShadow": { + "Type": "Bool", + "Value": true + }, + "CollisionGroupId": { + "Type": "Int32", + "Value": 0 + }, + "Color": { + "Type": "Color3uint8", + "Value": [ + 163, + 162, + 165 + ] + }, + "CustomPhysicalProperties": { + "Type": "PhysicalProperties", + "Value": "Default" + }, + "FormFactor": { + "Type": "Enum", + "Value": 1 + }, + "FrontParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "FrontParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "FrontSurface": { + "Type": "Enum", + "Value": 0 + }, + "FrontSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "LeftParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "LeftParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "LeftSurface": { + "Type": "Enum", + "Value": 0 + }, + "LeftSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Locked": { + "Type": "Bool", + "Value": false + }, + "Massless": { + "Type": "Bool", + "Value": false + }, + "Material": { + "Type": "Enum", + "Value": 256 + }, + "Reflectance": { + "Type": "Float32", + "Value": 0.0 + }, + "RightParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "RightParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "RightSurface": { + "Type": "Enum", + "Value": 0 + }, + "RightSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "RootPriority": { + "Type": "Int32", + "Value": 0 + }, + "RotVelocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + }, + "Size": { + "Type": "Vector3", + "Value": [ + 4.0, + 1.2, + 2.0 + ] + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TopParamA": { + "Type": "Float32", + "Value": -0.5 + }, + "TopParamB": { + "Type": "Float32", + "Value": 0.5 + }, + "TopSurface": { + "Type": "Enum", + "Value": 0 + }, + "TopSurfaceInput": { + "Type": "Enum", + "Value": 0 + }, + "Transparency": { + "Type": "Float32", + "Value": 0.0 + }, + "Velocity": { + "Type": "Vector3", + "Value": [ + 0.0, + 0.0, + 0.0 + ] + } + } + }, + "Weld": { + "Name": "Weld", + "Tags": [], + "Superclass": "JointInstance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "C0": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "WeldConstraint": { + "Name": "WeldConstraint", + "Tags": [], + "Superclass": "Instance", + "Properties": { + "Active": { + "Name": "Active", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Enabled": { + "Name": "Enabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Part0": { + "Name": "Part0", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Part1": { + "Name": "Part1", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "Workspace": { + "Name": "Workspace", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "WorldRoot", + "Properties": { + "AllowThirdPartySales": { + "Name": "AllowThirdPartySales", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "CollisionGroups": { + "Name": "CollisionGroups", + "Scriptability": "Custom", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "CurrentCamera": { + "Name": "CurrentCamera", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "DistributedGameTime": { + "Name": "DistributedGameTime", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float64" + }, + "Tags": [ + "NotReplicated" + ], + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Gravity": { + "Name": "Gravity", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "InterpolationThrottling": { + "Name": "InterpolationThrottling", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "InterpolationThrottlingMode" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MeshPartHeads": { + "Name": "MeshPartHeads", + "Scriptability": "None", + "DataType": { + "Enum": "MeshPartHeads" + }, + "Tags": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PhysicsSimulationRate": { + "Name": "PhysicsSimulationRate", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "PhysicsSimulationRate" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "PhysicsSteppingMethod": { + "Name": "PhysicsSteppingMethod", + "Scriptability": "None", + "DataType": { + "Enum": "PhysicsSteppingMethod" + }, + "Tags": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "StreamingEnabled": { + "Name": "StreamingEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "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": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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" + } + } + }, + "TouchesUseCollisionGroups": { + "Name": "TouchesUseCollisionGroups", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AllowThirdPartySales": { + "Type": "Bool", + "Value": false + }, + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CollisionGroups": { + "Type": "String", + "Value": "Default^0^1" + }, + "DistributedGameTime": { + "Type": "Float64", + "Value": 0.0 + }, + "FallenPartsDestroyHeight": { + "Type": "Float32", + "Value": -500.0 + }, + "FilteringEnabled": { + "Type": "Bool", + "Value": false + }, + "Gravity": { + "Type": "Float32", + "Value": 196.2 + }, + "InterpolationThrottling": { + "Type": "Enum", + "Value": 0 + }, + "LevelOfDetail": { + "Type": "Enum", + "Value": 0 + }, + "MeshPartHeads": { + "Type": "Enum", + "Value": 0 + }, + "PhysicsSteppingMethod": { + "Type": "Enum", + "Value": 0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "StreamingEnabled": { + "Type": "Bool", + "Value": false + }, + "StreamingMinRadius": { + "Type": "Int32", + "Value": 64 + }, + "StreamingPauseMode": { + "Type": "Enum", + "Value": 0 + }, + "StreamingTargetRadius": { + "Type": "Int32", + "Value": 1024 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + }, + "TouchesUseCollisionGroups": { + "Type": "Bool", + "Value": false + } + } + }, + "WorldModel": { + "Name": "WorldModel", + "Tags": [], + "Superclass": "WorldRoot", + "Properties": {}, + "DefaultProperties": {} + }, + "WorldRoot": { + "Name": "WorldRoot", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Model", + "Properties": {}, + "DefaultProperties": {} + }, + "WrapLayer": { + "Name": "WrapLayer", + "Tags": [], + "Superclass": "BaseWrap", + "Properties": { + "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" + } + } + }, + "Order": { + "Name": "Order", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Int32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Puffiness": { + "Name": "Puffiness", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ReferenceMeshId": { + "Name": "ReferenceMeshId", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Content" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "BindOffset": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "CageMeshId": { + "Type": "Content", + "Value": "" + }, + "CageOrigin": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "Enabled": { + "Type": "Bool", + "Value": true + }, + "ImportOrigin": { + "Type": "CFrame", + "Value": { + "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": { + "Type": "Int32", + "Value": 1 + }, + "Puffiness": { + "Type": "Float32", + "Value": 1.0 + }, + "ReferenceMeshId": { + "Type": "Content", + "Value": "" + }, + "ReferenceOrigin": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "ShrinkFactor": { + "Type": "Float32", + "Value": 0.0 + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + }, + "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": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": { + "AttributesSerialize": { + "Type": "BinaryString", + "Value": "" + }, + "CageMeshId": { + "Type": "Content", + "Value": "" + }, + "CageOrigin": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "ImportOrigin": { + "Type": "CFrame", + "Value": { + "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 + ] + ] + } + }, + "SourceAssetId": { + "Type": "Int64", + "Value": -1 + }, + "Stiffness": { + "Type": "Float32", + "Value": 0.9 + }, + "Tags": { + "Type": "BinaryString", + "Value": "" + } + } + } + }, + "Enums": { + "ABTestLoadingStatus": { + "name": "ABTestLoadingStatus", + "items": { + "Error": 3, + "Initialized": 2, + "None": 0, + "Pending": 1, + "ShutOff": 5, + "TimedOut": 4 + } + }, + "ActionType": { + "name": "ActionType", + "items": { + "Draw": 3, + "Lose": 2, + "Nothing": 0, + "Pause": 1, + "Win": 4 + } + }, + "ActuatorRelativeTo": { + "name": "ActuatorRelativeTo", + "items": { + "Attachment0": 0, + "Attachment1": 1, + "World": 2 + } + }, + "ActuatorType": { + "name": "ActuatorType", + "items": { + "Motor": 1, + "None": 0, + "Servo": 2 + } + }, + "AdornCullingMode": { + "name": "AdornCullingMode", + "items": { + "Automatic": 0, + "Never": 1 + } + }, + "AlignType": { + "name": "AlignType", + "items": { + "Parallel": 0, + "Perpendicular": 1 + } + }, + "AlphaMode": { + "name": "AlphaMode", + "items": { + "Overlay": 0, + "Transparency": 1 + } + }, + "AnalyticsEconomyAction": { + "name": "AnalyticsEconomyAction", + "items": { + "Acquire": 1, + "Default": 0, + "Spend": 2 + } + }, + "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 + } + }, + "AnimationPriority": { + "name": "AnimationPriority", + "items": { + "Action": 2, + "Core": 1000, + "Idle": 0, + "Movement": 1 + } + }, + "AppShellActionType": { + "name": "AppShellActionType", + "items": { + "AvatarEditorPageLoaded": 10, + "GamePageLoaded": 8, + "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 + } + }, + "AppUpdateStatus": { + "name": "AppUpdateStatus", + "items": { + "Available": 4, + "Failed": 2, + "NotAvailable": 3, + "NotSupported": 1, + "Unknown": 0 + } + }, + "AspectType": { + "name": "AspectType", + "items": { + "FitWithinMaxSize": 0, + "ScaleWithParentSize": 1 + } + }, + "AssetFetchStatus": { + "name": "AssetFetchStatus", + "items": { + "Failure": 1, + "Success": 0 + } + }, + "AssetType": { + "name": "AssetType", + "items": { + "Animation": 24, + "Audio": 3, + "BackAccessory": 46, + "Badge": 21, + "ClimbAnimation": 48, + "DeathAnimation": 49, + "Decal": 13, + "EarAccessory": 57, + "EmoteAnimation": 61, + "EyeAccessory": 58, + "Face": 18, + "FaceAccessory": 42, + "FallAnimation": 50, + "FrontAccessory": 45, + "GamePass": 34, + "Gear": 19, + "HairAccessory": 41, + "Hat": 8, + "Head": 17, + "IdleAnimation": 51, + "Image": 1, + "JumpAnimation": 52, + "LeftArm": 29, + "LeftLeg": 30, + "Lua": 5, + "Mesh": 4, + "MeshPart": 40, + "Model": 10, + "NeckAccessory": 43, + "Package": 32, + "Pants": 12, + "Place": 9, + "Plugin": 38, + "PoseAnimation": 56, + "RightArm": 28, + "RightLeg": 31, + "RunAnimation": 53, + "Shirt": 11, + "ShoulderAccessory": 44, + "SwimAnimation": 54, + "TeeShirt": 2, + "Torso": 27, + "Video": 62, + "WaistAccessory": 47, + "WalkAnimation": 55 + } + }, + "AssetTypeVerification": { + "name": "AssetTypeVerification", + "items": { + "Always": 3, + "ClientOnly": 2, + "Default": 1 + } + }, + "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": { + "BackAccessory": 46, + "ClimbAnimation": 48, + "EmoteAnimation": 61, + "Face": 18, + "FaceAccessory": 42, + "FallAnimation": 50, + "FrontAccessory": 45, + "Gear": 19, + "HairAccessory": 41, + "Hat": 8, + "Head": 17, + "IdleAnimation": 51, + "JumpAnimation": 52, + "LeftArm": 29, + "LeftLeg": 30, + "NeckAccessory": 43, + "Pants": 12, + "RightArm": 28, + "RightLeg": 31, + "RunAnimation": 53, + "Shirt": 11, + "ShoulderAccessory": 44, + "SwimAnimation": 54, + "TShirt": 2, + "Torso": 27, + "WaistAccessory": 47, + "WalkAnimation": 55 + } + }, + "AvatarContextMenuOption": { + "name": "AvatarContextMenuOption", + "items": { + "Chat": 1, + "Emote": 2, + "Friend": 0, + "InspectMenu": 3 + } + }, + "AvatarItemType": { + "name": "AvatarItemType", + "items": { + "Asset": 1, + "Bundle": 2 + } + }, + "AvatarJointPositionType": { + "name": "AvatarJointPositionType", + "items": { + "ArtistIntent": 1, + "Fixed": 0 + } + }, + "AvatarPromptResult": { + "name": "AvatarPromptResult", + "items": { + "Failed": 3, + "PermissionDenied": 2, + "Success": 1 + } + }, + "Axis": { + "name": "Axis", + "items": { + "X": 0, + "Y": 1, + "Z": 2 + } + }, + "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 + } + }, + "BreakReason": { + "name": "BreakReason", + "items": { + "Error": 1, + "Other": 0, + "SpecialBreakpoint": 2, + "UserBreakpoint": 3 + } + }, + "BulkMoveMode": { + "name": "BulkMoveMode", + "items": { + "FireAllEvents": 0, + "FireCFrameChanged": 1 + } + }, + "BundleType": { + "name": "BundleType", + "items": { + "Animations": 2, + "BodyParts": 1 + } + }, + "Button": { + "name": "Button", + "items": { + "Dismount": 8, + "Jump": 32 + } + }, + "ButtonStyle": { + "name": "ButtonStyle", + "items": { + "Custom": 0, + "RobloxButton": 2, + "RobloxButtonDefault": 1, + "RobloxRoundButton": 3, + "RobloxRoundDefaultButton": 4, + "RobloxRoundDropdownButton": 5 + } + }, + "CameraMode": { + "name": "CameraMode", + "items": { + "Classic": 0, + "LockFirstPerson": 1 + } + }, + "CameraPanMode": { + "name": "CameraPanMode", + "items": { + "Classic": 0, + "EdgeBump": 1 + } + }, + "CameraType": { + "name": "CameraType", + "items": { + "Attach": 1, + "Custom": 5, + "Fixed": 0, + "Follow": 4, + "Orbital": 7, + "Scriptable": 6, + "Track": 3, + "Watch": 2 + } + }, + "CatalogCategoryFilter": { + "name": "CatalogCategoryFilter", + "items": { + "Collectibles": 3, + "CommunityCreations": 4, + "Featured": 2, + "None": 1, + "Premium": 5 + } + }, + "CatalogSortType": { + "name": "CatalogSortType", + "items": { + "MostFavorited": 5, + "PriceHighToLow": 2, + "PriceLowToHigh": 3, + "RecentlyUpdated": 4, + "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 + } + }, + "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 + } + }, + "ChatStyle": { + "name": "ChatStyle", + "items": { + "Bubble": 1, + "Classic": 0, + "ClassicAndBubble": 2 + } + }, + "CollisionFidelity": { + "name": "CollisionFidelity", + "items": { + "Box": 2, + "Default": 0, + "Hull": 1, + "PreciseConvexDecomposition": 3 + } + }, + "ComputerCameraMovementMode": { + "name": "ComputerCameraMovementMode", + "items": { + "CameraToggle": 4, + "Classic": 1, + "Default": 0, + "Follow": 2, + "Orbital": 3 + } + }, + "ComputerMovementMode": { + "name": "ComputerMovementMode", + "items": { + "ClickToMove": 2, + "Default": 0, + "KeyboardMouse": 1 + } + }, + "ConnectionError": { + "name": "ConnectionError", + "items": { + "DisconnectBadhash": 257, + "DisconnectBlockedIP": 282, + "DisconnectBySecurityPolicy": 281, + "DisconnectCloudEditKick": 270, + "DisconnectConnectionLost": 277, + "DisconnectDevMaintenance": 274, + "DisconnectDuplicatePlayer": 264, + "DisconnectDuplicateTicket": 265, + "DisconnectErrors": 256, + "DisconnectEvicted": 273, + "DisconnectHashTimeout": 269, + "DisconnectIdle": 278, + "DisconnectIllegalTeleport": 263, + "DisconnectLuaKick": 267, + "DisconnectNewSecurityKeyMismatch": 272, + "DisconnectOnRemoteSysStats": 268, + "DisconnectPlayerless": 271, + "DisconnectProtocolMismatch": 259, + "DisconnectRaknetErrors": 279, + "DisconnectReceivePacketError": 260, + "DisconnectReceivePacketStreamError": 261, + "DisconnectRejoin": 276, + "DisconnectRobloxMaintenance": 275, + "DisconnectSecurityKeyMismatch": 258, + "DisconnectSendPacketError": 262, + "DisconnectTimeout": 266, + "DisconnectWrongVersion": 280, + "OK": 0, + "PlacelaunchCustomMessage": 610, + "PlacelaunchDisabled": 515, + "PlacelaunchError": 516, + "PlacelaunchErrors": 512, + "PlacelaunchFlooded": 525, + "PlacelaunchGameEnded": 517, + "PlacelaunchGameFull": 518, + "PlacelaunchHashException": 527, + "PlacelaunchHashExpired": 526, + "PlacelaunchHttpError": 529, + "PlacelaunchOtherError": 611, + "PlacelaunchPartyCannotFit": 528, + "PlacelaunchRestricted": 523, + "PlacelaunchUnauthorized": 524, + "PlacelaunchUserLeft": 522, + "TeleportErrors": 768, + "TeleportFailure": 769, + "TeleportFlooded": 774, + "TeleportGameEnded": 771, + "TeleportGameFull": 772, + "TeleportGameNotFound": 770, + "TeleportIsTeleporting": 775, + "TeleportUnauthorized": 773 + } + }, + "ConnectionState": { + "name": "ConnectionState", + "items": { + "Connected": 0, + "Disconnected": 1 + } + }, + "ContextActionPriority": { + "name": "ContextActionPriority", + "items": { + "Default": 2000, + "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, + "Backpack": 2, + "Chat": 3, + "EmotesMenu": 5, + "Health": 1, + "PlayerList": 0 + } + }, + "CreatorType": { + "name": "CreatorType", + "items": { + "Group": 1, + "User": 0 + } + }, + "CurrencyType": { + "name": "CurrencyType", + "items": { + "Default": 0, + "Robux": 1, + "Tix": 2 + } + }, + "CustomCameraMode": { + "name": "CustomCameraMode", + "items": { + "Classic": 1, + "Default": 0, + "Follow": 2 + } + }, + "DataStoreRequestType": { + "name": "DataStoreRequestType", + "items": { + "GetAsync": 0, + "GetSortedAsync": 3, + "OnUpdate": 5, + "SetIncrementAsync": 1, + "SetIncrementSortedAsync": 4, + "UpdateAsync": 2 + } + }, + "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": 21, + "GraphicsMeshParts": 9, + "GraphicsParticles": 10, + "GraphicsParts": 11, + "GraphicsSolidModels": 8, + "GraphicsSpatialHash": 12, + "GraphicsTerrain": 13, + "GraphicsTexture": 14, + "GraphicsTextureCharacter": 15, + "Gui": 20, + "HttpCache": 1, + "Instances": 2, + "Internal": 0, + "LuaHeap": 4, + "Navigation": 22, + "PhysicsCollision": 6, + "PhysicsParts": 7, + "Script": 5, + "Signals": 3, + "Sounds": 16, + "StreamingSounds": 17, + "TerrainVoxels": 18 + } + }, + "DeviceType": { + "name": "DeviceType", + "items": { + "Desktop": 1, + "Phone": 3, + "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 + } + }, + "DominantAxis": { + "name": "DominantAxis", + "items": { + "Height": 1, + "Width": 0 + } + }, + "DraftStatusCode": { + "name": "DraftStatusCode", + "items": { + "DraftCommitted": 3, + "DraftOutdated": 1, + "OK": 0, + "ScriptRemoved": 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 + } + }, + "ElasticBehavior": { + "name": "ElasticBehavior", + "items": { + "Always": 1, + "Never": 2, + "WhenScrollable": 0 + } + }, + "EnviromentalPhysicsThrottle": { + "name": "EnviromentalPhysicsThrottle", + "items": { + "Always": 2, + "DefaultAuto": 0, + "Disabled": 1, + "Skip16": 6, + "Skip2": 3, + "Skip4": 4, + "Skip8": 5 + } + }, + "ExplosionType": { + "name": "ExplosionType", + "items": { + "Craters": 1, + "NoCraters": 0 + } + }, + "FieldOfViewMode": { + "name": "FieldOfViewMode", + "items": { + "Diagonal": 1, + "MaxAxis": 2, + "Vertical": 0 + } + }, + "FillDirection": { + "name": "FillDirection", + "items": { + "Horizontal": 0, + "Vertical": 1 + } + }, + "FilterResult": { + "name": "FilterResult", + "items": { + "Accepted": 0, + "Rejected": 1 + } + }, + "Font": { + "name": "Font", + "items": { + "AmaticSC": 21, + "Antique": 15, + "Arcade": 13, + "Arial": 1, + "ArialBold": 2, + "Bangers": 22, + "Bodoni": 7, + "Cartoon": 9, + "Code": 10, + "Creepster": 23, + "DenkOne": 24, + "Fantasy": 14, + "Fondamento": 25, + "FredokaOne": 26, + "Garamond": 8, + "Gotham": 17, + "GothamBlack": 20, + "GothamBold": 19, + "GothamSemibold": 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 + } + }, + "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 + } + }, + "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 + } + }, + "FunctionalTestResult": { + "name": "FunctionalTestResult", + "items": { + "Error": 2, + "Passed": 0, + "Warning": 1 + } + }, + "GameAvatarType": { + "name": "GameAvatarType", + "items": { + "PlayerChoice": 2, + "R15": 1, + "R6": 0 + } + }, + "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 + } + }, + "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 + } + }, + "GraphicsMode": { + "name": "GraphicsMode", + "items": { + "Automatic": 1, + "Direct3D11": 2, + "Direct3D9": 3, + "Metal": 5, + "NoGraphics": 7, + "OpenGL": 4, + "Vulkan": 6 + } + }, + "HandlesStyle": { + "name": "HandlesStyle", + "items": { + "Movement": 1, + "Resize": 0 + } + }, + "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 + } + }, + "HttpContentType": { + "name": "HttpContentType", + "items": { + "ApplicationJson": 0, + "ApplicationUrlEncoded": 2, + "ApplicationXml": 1, + "TextPlain": 3, + "TextXml": 4 + } + }, + "HttpError": { + "name": "HttpError", + "items": { + "Aborted": 9, + "ConnectFail": 3, + "DnsResolve": 2, + "InvalidRedirect": 7, + "InvalidUrl": 1, + "NetFail": 8, + "OK": 0, + "OutOfMemory": 4, + "SslConnectFail": 10, + "SslVerificationFail": 11, + "TimedOut": 5, + "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 + } + }, + "IXPLoadingStatus": { + "name": "IXPLoadingStatus", + "items": { + "ErrorConnection": 5, + "ErrorInvalidUser": 4, + "ErrorJsonParse": 6, + "ErrorTimedOut": 7, + "Initialized": 2, + "None": 0, + "Pending": 1, + "ShutOff": 3 + } + }, + "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 + } + }, + "InputType": { + "name": "InputType", + "items": { + "Constant": 12, + "NoInput": 0, + "Sin": 13 + } + }, + "InterpolationThrottlingMode": { + "name": "InterpolationThrottlingMode", + "items": { + "Default": 0, + "Disabled": 1, + "Enabled": 2 + } + }, + "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, + "ButtonL1": 1005, + "ButtonL2": 1007, + "ButtonL3": 1009, + "ButtonR1": 1004, + "ButtonR2": 1006, + "ButtonR3": 1008, + "ButtonSelect": 1011, + "ButtonStart": 1010, + "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, + "N": 110, + "Nine": 57, + "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, + "Thumbstick2": 1017, + "Tilde": 126, + "Two": 50, + "U": 117, + "Underscore": 95, + "Undo": 322, + "Unknown": 0, + "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 + } + }, + "KeywordFilterType": { + "name": "KeywordFilterType", + "items": { + "Exclude": 1, + "Include": 0 + } + }, + "Language": { + "name": "Language", + "items": { + "Default": 0 + } + }, + "LanguagePreference": { + "name": "LanguagePreference", + "items": { + "English": 1, + "Korean": 3, + "SimplifiedChinese": 2, + "SystemDefault": 0 + } + }, + "LeftRight": { + "name": "LeftRight", + "items": { + "Center": 1, + "Left": 0, + "Right": 2 + } + }, + "LevelOfDetailSetting": { + "name": "LevelOfDetailSetting", + "items": { + "High": 2, + "Low": 0, + "Medium": 1 + } + }, + "Limb": { + "name": "Limb", + "items": { + "Head": 0, + "LeftArm": 2, + "LeftLeg": 4, + "RightArm": 3, + "RightLeg": 5, + "Torso": 1, + "Unknown": 6 + } + }, + "ListDisplayMode": { + "name": "ListDisplayMode", + "items": { + "Horizontal": 0, + "Vertical": 1 + } + }, + "ListenerType": { + "name": "ListenerType", + "items": { + "CFrame": 1, + "Camera": 0, + "ObjectCFrame": 3, + "ObjectPosition": 2 + } + }, + "Material": { + "name": "Material", + "items": { + "Air": 1792, + "Asphalt": 1376, + "Basalt": 788, + "Brick": 848, + "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, + "Limestone": 820, + "Marble": 784, + "Metal": 1088, + "Mud": 1344, + "Neon": 288, + "Pavement": 836, + "Pebble": 864, + "Plastic": 256, + "Rock": 896, + "Salt": 1392, + "Sand": 1296, + "Sandstone": 912, + "Slate": 800, + "SmoothPlastic": 272, + "Snow": 1328, + "Water": 2048, + "Wood": 512, + "WoodPlanks": 528 + } + }, + "MembershipType": { + "name": "MembershipType", + "items": { + "BuildersClub": 1, + "None": 0, + "OutrageousBuildersClub": 3, + "Premium": 4, + "TurboBuildersClub": 2 + } + }, + "MeshPartDetailLevel": { + "name": "MeshPartDetailLevel", + "items": { + "DistanceBased": 0, + "Level01": 1, + "Level02": 2, + "Level03": 3, + "Level04": 4 + } + }, + "MeshPartHeads": { + "name": "MeshPartHeads", + "items": { + "Default": 0, + "Disabled": 1, + "Enabled": 2 + } + }, + "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, + "StreamingMesh": 1 + } + }, + "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 + } + }, + "NameOcclusion": { + "name": "NameOcclusion", + "items": { + "EnemyOcclusion": 1, + "NoOcclusion": 0, + "OccludeAll": 2 + } + }, + "NetworkOwnership": { + "name": "NetworkOwnership", + "items": { + "Automatic": 0, + "Manual": 1, + "OnContact": 2 + } + }, + "NormalId": { + "name": "NormalId", + "items": { + "Back": 2, + "Bottom": 4, + "Front": 5, + "Left": 3, + "Right": 0, + "Top": 1 + } + }, + "OutputLayoutMode": { + "name": "OutputLayoutMode", + "items": { + "Horizontal": 0, + "Vertical": 1 + } + }, + "OverrideMouseIconBehavior": { + "name": "OverrideMouseIconBehavior", + "items": { + "ForceHide": 2, + "ForceShow": 1, + "None": 0 + } + }, + "PacketPriority": { + "name": "PacketPriority", + "items": { + "HIGH_PRIORITY": 1, + "IMMEDIATE_PRIORITY": 0, + "LOW_PRIORITY": 3, + "MEDIUM_PRIORITY": 2 + } + }, + "PartType": { + "name": "PartType", + "items": { + "Ball": 0, + "Block": 1, + "Cylinder": 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": { + "Jump": 1, + "Walk": 0 + } + }, + "PermissionLevelShown": { + "name": "PermissionLevelShown", + "items": { + "Game": 0, + "Roblox": 4, + "RobloxGame": 1, + "RobloxScript": 2, + "Studio": 3 + } + }, + "PhysicsSimulationRate": { + "name": "PhysicsSimulationRate", + "items": { + "Fixed120Hz": 1, + "Fixed240Hz": 0, + "Fixed60Hz": 2 + } + }, + "PhysicsSteppingMethod": { + "name": "PhysicsSteppingMethod", + "items": { + "Adaptive": 2, + "Default": 0, + "Fixed": 1 + } + }, + "Platform": { + "name": "Platform", + "items": { + "Android": 3, + "AndroidTV": 11, + "BeOS": 17, + "Chromecast": 12, + "DOS": 16, + "IOS": 2, + "Linux": 13, + "NX": 9, + "None": 19, + "OSX": 1, + "Ouya": 10, + "PS3": 6, + "PS4": 5, + "SteamOS": 14, + "UWP": 18, + "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 + } + }, + "PlayerChatType": { + "name": "PlayerChatType", + "items": { + "All": 0, + "Team": 1, + "Whisper": 2 + } + }, + "PoseEasingDirection": { + "name": "PoseEasingDirection", + "items": { + "In": 0, + "InOut": 2, + "Out": 1 + } + }, + "PoseEasingStyle": { + "name": "PoseEasingStyle", + "items": { + "Bounce": 4, + "Constant": 1, + "Cubic": 3, + "Elastic": 2, + "Linear": 0 + } + }, + "PrivilegeType": { + "name": "PrivilegeType", + "items": { + "Admin": 240, + "Banned": 0, + "Member": 128, + "Owner": 255, + "Visitor": 10 + } + }, + "ProductPurchaseDecision": { + "name": "ProductPurchaseDecision", + "items": { + "NotProcessedYet": 0, + "PurchaseGranted": 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 + } + }, + "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 + } + }, + "R15CollisionType": { + "name": "R15CollisionType", + "items": { + "InnerBox": 1, + "OuterBox": 0 + } + }, + "RaycastFilterType": { + "name": "RaycastFilterType", + "items": { + "Blacklist": 0, + "Whitelist": 1 + } + }, + "RenderFidelity": { + "name": "RenderFidelity", + "items": { + "Automatic": 0, + "Performance": 2, + "Precise": 1 + } + }, + "RenderPriority": { + "name": "RenderPriority", + "items": { + "Camera": 200, + "Character": 300, + "First": 0, + "Input": 100, + "Last": 2000 + } + }, + "RenderingTestComparisonMethod": { + "name": "RenderingTestComparisonMethod", + "items": { + "diff": 1, + "psnr": 0 + } + }, + "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 + } + }, + "RibbonTool": { + "name": "RibbonTool", + "items": { + "ColorPicker": 5, + "Group": 7, + "MaterialPicker": 6, + "Move": 3, + "None": 9, + "Rotate": 2, + "Scale": 1, + "Select": 0, + "Transform": 4, + "Ungroup": 8 + } + }, + "RollOffMode": { + "name": "RollOffMode", + "items": { + "Inverse": 0, + "InverseTapered": 3, + "Linear": 1, + "LinearSquare": 2 + } + }, + "RotationType": { + "name": "RotationType", + "items": { + "CameraRelative": 1, + "MovementRelative": 0 + } + }, + "RuntimeUndoBehavior": { + "name": "RuntimeUndoBehavior", + "items": { + "Aggregate": 0, + "Hybrid": 2, + "Snapshot": 1 + } + }, + "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 + } + }, + "ScreenOrientation": { + "name": "ScreenOrientation", + "items": { + "LandscapeLeft": 0, + "LandscapeRight": 1, + "LandscapeSensor": 2, + "Portrait": 3, + "Sensor": 4 + } + }, + "ScrollBarInset": { + "name": "ScrollBarInset", + "items": { + "Always": 2, + "None": 0, + "ScrollBar": 1 + } + }, + "ScrollingDirection": { + "name": "ScrollingDirection", + "items": { + "X": 1, + "XY": 4, + "Y": 2 + } + }, + "ServerAudioBehavior": { + "name": "ServerAudioBehavior", + "items": { + "Enabled": 0, + "Muted": 1, + "OnlineGame": 2 + } + }, + "SizeConstraint": { + "name": "SizeConstraint", + "items": { + "RelativeXX": 1, + "RelativeXY": 0, + "RelativeYY": 2 + } + }, + "SortDirection": { + "name": "SortDirection", + "items": { + "Ascending": 0, + "Descending": 1 + } + }, + "SortOrder": { + "name": "SortOrder", + "items": { + "Custom": 1, + "LayoutOrder": 2, + "Name": 0 + } + }, + "SoundType": { + "name": "SoundType", + "items": { + "Boing": 1, + "Bomb": 2, + "Break": 3, + "Click": 4, + "Clock": 5, + "NoSound": 0, + "Page": 7, + "Ping": 8, + "Slingshot": 6, + "Snap": 9, + "Splat": 10, + "Step": 11, + "StepOn": 12, + "Swoosh": 13, + "Victory": 14 + } + }, + "SpecialKey": { + "name": "SpecialKey", + "items": { + "ChatHotkey": 5, + "End": 2, + "Home": 1, + "Insert": 0, + "PageDown": 4, + "PageUp": 3 + } + }, + "StartCorner": { + "name": "StartCorner", + "items": { + "BottomLeft": 2, + "BottomRight": 3, + "TopLeft": 0, + "TopRight": 1 + } + }, + "Status": { + "name": "Status", + "items": { + "Confusion": 1, + "Poison": 0 + } + }, + "StreamingPauseMode": { + "name": "StreamingPauseMode", + "items": { + "ClientPhysicsPause": 2, + "Default": 0, + "Disabled": 1 + } + }, + "StudioDataModelType": { + "name": "StudioDataModelType", + "items": { + "Edit": 0, + "None": 6, + "PlayClient": 2, + "PlayServer": 3, + "RobloxPlugin": 4, + "UserPlugin": 5 + } + }, + "StudioScriptEditorColorCategories": { + "name": "StudioScriptEditorColorCategories", + "items": { + "ActiveLine": 25, + "Background": 17, + "Bool": 10, + "Bracket": 29, + "Builtin": 6, + "Comment": 4, + "DebuggerCurrentLine": 26, + "DebuggerErrorLine": 27, + "Default": 0, + "Error": 23, + "FindSelectionBackground": 20, + "Function": 11, + "FunctionName": 15, + "Keyword": 5, + "Local": 12, + "LuauKeyword": 14, + "MatchingWordBackground": 21, + "Method": 7, + "Nil": 9, + "Number": 2, + "Operator": 1, + "Property": 8, + "Ruler": 28, + "SelectionBackground": 19, + "SelectionText": 18, + "Self": 13, + "String": 3, + "TODO": 16, + "Warning": 22, + "Whitespace": 24 + } + }, + "StudioScriptEditorColorPresets": { + "name": "StudioScriptEditorColorPresets", + "items": { + "Custom": 3, + "Extra1": 1, + "Extra2": 2, + "RobloxDefault": 0 + } + }, + "StudioStyleGuideColor": { + "name": "StudioStyleGuideColor", + "items": { + "AttributeCog": 109, + "Border": 25, + "BrightText": 33, + "Button": 11, + "ButtonBorder": 81, + "ButtonText": 82, + "CategoryItem": 18, + "ChatIncomingBgColor": 75, + "ChatIncomingTextColor": 76, + "ChatModeratedMessageColor": 79, + "ChatOutgoingBgColor": 77, + "ChatOutgoingTextColor": 78, + "CheckedFieldBackground": 84, + "CheckedFieldBorder": 85, + "CheckedFieldIndicator": 86, + "ColorPickerFrame": 23, + "CurrentMarker": 24, + "Dark": 28, + "DebuggerCurrentLine": 57, + "DebuggerErrorLine": 58, + "DialogButton": 90, + "DialogButtonBorder": 92, + "DialogButtonText": 91, + "DialogMainButton": 93, + "DialogMainButtonText": 94, + "DiffFilePathBackground": 73, + "DiffFilePathBorder": 74, + "DiffFilePathText": 59, + "DiffLineNum": 68, + "DiffLineNumAdditionBackground": 71, + "DiffLineNumDeletionBackground": 72, + "DiffLineNumNoChangeBackground": 70, + "DiffLineNumSeparatorBackground": 69, + "DiffTextAddition": 62, + "DiffTextAdditionBackground": 66, + "DiffTextDeletion": 63, + "DiffTextDeletionBackground": 67, + "DiffTextHunkInfo": 60, + "DiffTextNoChange": 61, + "DiffTextNoChangeBackground": 65, + "DiffTextSeparatorBackground": 64, + "DimmedText": 34, + "Dropdown": 2, + "EmulatorBar": 21, + "EmulatorDropDown": 22, + "ErrorText": 37, + "GameSettingsTableItem": 19, + "GameSettingsTooltip": 20, + "HeaderSection": 87, + "InfoBarWarningBackground": 95, + "InfoBarWarningText": 96, + "InfoText": 38, + "InputFieldBackground": 15, + "InputFieldBorder": 83, + "Item": 16, + "Light": 27, + "LinkText": 35, + "MainBackground": 0, + "MainButton": 12, + "MainText": 30, + "Mid": 29, + "Midlight": 88, + "Notification": 4, + "RibbonButton": 13, + "RibbonTab": 9, + "RibbonTabTopBar": 10, + "ScriptBackground": 41, + "ScriptBool": 101, + "ScriptBracket": 108, + "ScriptBuiltInFunction": 52, + "ScriptComment": 50, + "ScriptEditorCurrentLine": 97, + "ScriptError": 54, + "ScriptFindSelectionBackground": 45, + "ScriptFunction": 102, + "ScriptFunctionName": 106, + "ScriptKeyword": 51, + "ScriptLocal": 103, + "ScriptLuauKeyword": 105, + "ScriptMatchingWordSelectionBackground": 46, + "ScriptMethod": 98, + "ScriptNil": 100, + "ScriptNumber": 48, + "ScriptOperator": 47, + "ScriptProperty": 99, + "ScriptRuler": 56, + "ScriptSelectionBackground": 44, + "ScriptSelectionText": 43, + "ScriptSelf": 104, + "ScriptSideWidget": 40, + "ScriptString": 49, + "ScriptText": 42, + "ScriptTodo": 107, + "ScriptWarning": 53, + "ScriptWhitespace": 55, + "ScrollBar": 5, + "ScrollBarBackground": 6, + "SensitiveText": 39, + "Separator": 80, + "Shadow": 26, + "StatusBar": 89, + "SubText": 31, + "Tab": 8, + "TabBar": 7, + "TableItem": 17, + "Titlebar": 1, + "TitlebarText": 32, + "Tooltip": 3, + "ViewPortBackground": 14, + "WarningText": 36 + } + }, + "StudioStyleGuideModifier": { + "name": "StudioStyleGuideModifier", + "items": { + "Default": 0, + "Disabled": 3, + "Hover": 4, + "Pressed": 2, + "Selected": 1 + } + }, + "Style": { + "name": "Style", + "items": { + "AlternatingSupports": 0, + "BridgeStyleSupports": 1, + "NoSupports": 2 + } + }, + "SurfaceConstraint": { + "name": "SurfaceConstraint", + "items": { + "Hinge": 1, + "Motor": 3, + "None": 0, + "SteppingMotor": 2 + } + }, + "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 + } + }, + "TableMajorAxis": { + "name": "TableMajorAxis", + "items": { + "ColumnMajor": 1, + "RowMajor": 0 + } + }, + "Technology": { + "name": "Technology", + "items": { + "Compatibility": 2, + "Future": 4, + "Legacy": 0, + "ShadowMap": 3, + "Voxel": 1 + } + }, + "TeleportMethod": { + "name": "TeleportMethod", + "items": { + "TeleportPartyAsync": 3, + "TeleportToPlaceInstance": 1, + "TeleportToPrivateServer": 2, + "TeleportToSpawnByName": 0, + "TeleportUnknown": 4 + } + }, + "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, + "ToPlace": 0, + "ToReservedServer": 2 + } + }, + "TextFilterContext": { + "name": "TextFilterContext", + "items": { + "PrivateChat": 2, + "PublicChat": 1 + } + }, + "TextInputType": { + "name": "TextInputType", + "items": { + "Default": 0, + "Email": 3, + "NoSuggestions": 1, + "Number": 2, + "Password": 5, + "PasswordShown": 6, + "Phone": 4, + "Username": 7 + } + }, + "TextTruncate": { + "name": "TextTruncate", + "items": { + "AtEnd": 1, + "None": 0 + } + }, + "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 + } + }, + "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 + } + }, + "TriStateBoolean": { + "name": "TriStateBoolean", + "items": { + "False": 2, + "True": 1, + "Unknown": 0 + } + }, + "TweenStatus": { + "name": "TweenStatus", + "items": { + "Canceled": 0, + "Completed": 1 + } + }, + "UITheme": { + "name": "UITheme", + "items": { + "Dark": 1, + "Light": 0 + } + }, + "UiMessageType": { + "name": "UiMessageType", + "items": { + "UiMessageError": 0, + "UiMessageInfo": 1 + } + }, + "UserCFrame": { + "name": "UserCFrame", + "items": { + "Head": 0, + "LeftHand": 1, + "RightHand": 2 + } + }, + "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 + } + }, + "VRTouchpad": { + "name": "VRTouchpad", + "items": { + "Left": 0, + "Right": 1 + } + }, + "VRTouchpadMode": { + "name": "VRTouchpadMode", + "items": { + "ABXY": 2, + "Touch": 0, + "VirtualThumbstick": 1 + } + }, + "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 + } + }, + "VirtualInputMode": { + "name": "VirtualInputMode", + "items": { + "None": 0, + "Playing": 2, + "Recording": 1 + } + }, + "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 + } + }, + "WrapLayerDebugMode": { + "name": "WrapLayerDebugMode", + "items": { + "BoundCage": 1, + "BoundCageAndLinks": 3, + "LayerCage": 2, + "None": 0, + "Reference": 4 + } + }, + "WrapTargetDebugMode": { + "name": "WrapTargetDebugMode", + "items": { + "None": 0, + "TargetCage": 1 + } + }, + "ZIndexBehavior": { + "name": "ZIndexBehavior", + "items": { + "Global": 0, + "Sibling": 1 + } + } + } +} \ 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 95% rename from plugin/rbx_dom_lua/init.lua rename to plugin/rbx_dom_lua/src/init.lua index 2d390a24..a9386d4d 100644 --- a/plugin/rbx_dom_lua/init.lua +++ b/plugin/rbx_dom_lua/src/init.lua @@ -22,10 +22,9 @@ local function findCanonicalPropertyDescriptor(className, propertyName) local aliasData = propertyData.Kind.Alias if aliasData ~= nil then return PropertyDescriptor.fromRaw( - currentClass.Properties[aliasData.AliasFor], + currentClass.properties[aliasData.AliasFor], currentClassName, - aliasData.AliasFor - ) + aliasData.AliasFor) end return nil @@ -67,4 +66,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 b/plugin/rbx_dom_lua/test new file mode 100644 index 00000000..9ac1092f --- /dev/null +++ b/plugin/rbx_dom_lua/test @@ -0,0 +1,4 @@ +#!/bin/sh + +rojo build test-place.project.json -o TestPlace.rbxlx +run-in-roblox --script run-tests.lua --place TestPlace.rbxlx \ 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..3cd48403 --- /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": "run-tests.lua" + } + }, + "Players": { + "$className": "Players", + "$properties": { + "CharacterAutoLoads": false + } + }, + "HttpService": { + "$className": "HttpService", + "$properties": { + "HttpEnabled": true + } + } + } +} \ 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..103cde70 100644 --- a/plugin/src/Config.lua +++ b/plugin/src/Config.lua @@ -2,26 +2,12 @@ local strict = require(script.Parent.strict) local isDevBuild = script.Parent.Parent:FindFirstChild("ROJO_DEV_BUILD") ~= nil -local Version = script.Parent.Parent.Version -local trimmedVersionValue = Version.Value:gsub("^%s+", ""):gsub("%s+$", "") -local major, minor, patch, metadata = trimmedVersionValue:match("^(%d+)%.(%d+)%.(%d+)(.*)$") - -local realVersion = { major, minor, patch, metadata } -for i = 1, 3 do - local num = tonumber(realVersion[i]) - if num then - realVersion[i] = num - else - error(("invalid version `%s` (field %d)"):format(realVersion[i], i)) - end -end - return strict("Config", { isDevBuild = isDevBuild, codename = "Epiphany", - version = realVersion, - expectedServerVersionString = ("%d.%d or newer"):format(realVersion[1], realVersion[2]), - protocolVersion = 5, + version = {7, 0, 0, "-alpha.2"}, + expectedServerVersionString = "7.0 or newer", + protocolVersion = 4, defaultHost = "localhost", - defaultPort = "34872", -}) + defaultPort = 34872, +}) \ No newline at end of file diff --git a/plugin/src/DevSettings.lua b/plugin/src/DevSettings.lua new file mode 100644 index 00000000..f1458c00 --- /dev/null +++ b/plugin/src/DevSettings.lua @@ -0,0 +1,139 @@ +local Config = require(script.Parent.Config) + +local Environment = { + User = "User", + Dev = "Dev", + Test = "Test", +} + +local DEFAULT_ENVIRONMENT = Config.isDevBuild and Environment.Dev or Environment.User + +local VALUES = { + LogLevel = { + type = "IntValue", + values = { + [Environment.User] = 2, + [Environment.Dev] = 4, + [Environment.Test] = 4, + }, + }, + TypecheckingEnabled = { + type = "BoolValue", + values = { + [Environment.User] = false, + [Environment.Dev] = true, + [Environment.Test] = true, + }, + }, +} + +local CONTAINER_NAME = "RojoDevSettings" .. Config.codename + +local function getValueContainer() + return game:FindFirstChild(CONTAINER_NAME) +end + +local valueContainer = getValueContainer() + +game.ChildAdded:Connect(function(child) + local success, name = pcall(function() + return child.Name + end) + + if success and name == CONTAINER_NAME then + valueContainer = child + end +end) + +local function getStoredValue(name) + if valueContainer == nil then + return nil + end + + local valueObject = valueContainer:FindFirstChild(name) + + if valueObject == nil then + return nil + end + + return valueObject.Value +end + +local function setStoredValue(name, kind, value) + local object = valueContainer:FindFirstChild(name) + + if object == nil then + object = Instance.new(kind) + object.Name = name + object.Parent = valueContainer + end + + object.Value = value +end + +local function createAllValues(environment) + assert(Environment[environment] ~= nil, "Invalid environment") + + valueContainer = getValueContainer() + + if valueContainer == nil then + valueContainer = Instance.new("Folder") + valueContainer.Name = CONTAINER_NAME + valueContainer.Parent = game + end + + for name, value in pairs(VALUES) do + setStoredValue(name, value.type, value.values[environment]) + end +end + +local function getValue(name) + assert(VALUES[name] ~= nil, "Invalid DevSettings name") + + local stored = getStoredValue(name) + + if stored ~= nil then + return stored + end + + return VALUES[name].values[DEFAULT_ENVIRONMENT] +end + +local DevSettings = {} + +function DevSettings:createDevSettings() + createAllValues(Environment.Dev) +end + +function DevSettings:createTestSettings() + createAllValues(Environment.Test) +end + +function DevSettings:hasChangedValues() + return valueContainer ~= nil +end + +function DevSettings:resetValues() + if valueContainer then + valueContainer:Destroy() + valueContainer = nil + end +end + +function DevSettings:isEnabled() + return valueContainer ~= nil +end + +function DevSettings:getLogLevel() + return getValue("LogLevel") +end + +function DevSettings:shouldTypecheck() + return getValue("TypecheckingEnabled") +end + +function _G.ROJO_DEV_CREATE() + DevSettings:createDevSettings() +end + +return DevSettings \ No newline at end of file diff --git a/plugin/src/Dictionary.lua b/plugin/src/Dictionary.lua index 09b878a6..c4b1e532 100644 --- a/plugin/src/Dictionary.lua +++ b/plugin/src/Dictionary.lua @@ -14,7 +14,7 @@ local function merge(...) local source = select(i, ...) if source ~= nil then - for key, value in source do + for key, value in pairs(source) do if value == None then output[key] = nil else @@ -30,4 +30,4 @@ end return { None = None, merge = merge, -} +} \ No newline at end of file diff --git a/plugin/src/InstanceMap.lua b/plugin/src/InstanceMap.lua index 250f41e6..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__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 index 805b1d50..ecec4172 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__unresolved_values.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__unresolved_values.snap @@ -21,7 +21,6 @@ expression: contents Workspace - false @@ -32,21 +31,11 @@ expression: contents Color - - 1 - 2 - 3 - 0 - 1 - 0 - 0 - 0 - 1 - 1 - 0 - 0 - - 8404992 + + 0.5 + 0.25 + 0 + 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 index aecca203..d5f5d534 100644 --- a/rojo-test/build-tests/unresolved_values/default.project.json +++ b/rojo-test/build-tests/unresolved_values/default.project.json @@ -14,13 +14,7 @@ "Color": { "$className": "Part", "$properties": { - "Color": [0.5, 0.25, 0], - "CFrame": [ - 1, 2, 3, - 0, 1, 0, - 0, 0, 1, - 1, 0, 0 - ] + "Color": [0.5, 0.25, 0] } }, 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_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap index 4de31360..0444cb3a 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap @@ -1,13 +1,12 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: add_folder -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_subscribe.snap index 4a724f1e..09d4512c 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_subscribe.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_subscribe.snap @@ -1,21 +1,19 @@ --- source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" +expression: "subscribe_response.intern_and_redact(&mut redactions, ())" --- -body: - messageCursor: 1 - messages: - - added: - id-3: - Children: [] - ClassName: Folder - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: my-new-folder - Parent: id-2 - Properties: {} - removed: [] - updated: [] -packetType: messages +messageCursor: 1 +messages: + - added: + id-3: + Children: [] + ClassName: Folder + Id: id-3 + Metadata: + ignoreUnknownInstances: false + Name: my-new-folder + Parent: id-2 + Properties: {} + removed: [] + updated: [] sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder.snap 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..7218c9bf 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: @@ -14,7 +13,7 @@ instances: Parent: "00000000000000000000000000000000" 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..d0b1b97a 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: @@ -14,7 +13,7 @@ instances: Parent: "00000000000000000000000000000000" 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..b0d0f272 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap @@ -1,13 +1,12 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: edit_init -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_subscribe.snap index 32a266ea..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_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap index bb9159c5..ca7b8101 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap @@ -1,13 +1,12 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: empty -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all-2.snap 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..c9b36434 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 @@ -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_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap index 692bae6f..3a43a9c3 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap @@ -1,13 +1,12 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: move_folder_of_stuff -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_subscribe.snap index 547ddd58..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.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_all.snap index 4ec6ce4c..855c79ec 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: @@ -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..e3f3c2f8 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap @@ -1,13 +1,12 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: remove_file -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_subscribe.snap index e9e39e04..e70d17f9 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_subscribe.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_subscribe.snap @@ -1,13 +1,11 @@ --- source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" +expression: "subscribe_response.intern_and_redact(&mut redactions, ())" --- -body: - messageCursor: 1 - messages: - - added: {} - removed: - - id-3 - updated: [] -packetType: messages +messageCursor: 1 +messages: + - added: {} + removed: + - id-3 + updated: [] sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all-2.snap index 49d8148b..72ab9efc 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: @@ -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..1748f264 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: @@ -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..5f2b05c5 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap @@ -1,13 +1,12 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: scripts -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_subscribe.snap index d4050101..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..a964c6ad 100644 --- a/src/change_processor.rs +++ b/src/change_processor.rs @@ -1,13 +1,13 @@ -use crossbeam_channel::{select, Receiver, RecvError, Sender}; -use jod_thread::JoinHandle; -use memofs::{IoResultExt, Vfs, VfsEvent}; -use rbx_dom_weak::types::{Ref, Variant}; -use std::path::PathBuf; use std::{ fs, sync::{Arc, Mutex}, }; +use crossbeam_channel::{select, Receiver, RecvError, Sender}; +use jod_thread::JoinHandle; +use memofs::{IoResultExt, Vfs, VfsEvent}; +use rbx_dom_weak::types::{Ref, Variant}; + use crate::{ message_queue::MessageQueue, snapshot::{ @@ -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,16 +176,8 @@ impl JobThreadContext { if let Some(instance) = tree.get_instance(id) { if let Some(instigating_source) = &instance.metadata().instigating_source { match instigating_source { - InstigatingSource::Path(path) => { - if let Err(err) = fs::remove_file(path) { - log::error!( - "Failed to remove file {}: {}", - path.display(), - err - ); - } - } - InstigatingSource::ProjectNode { .. } => { + InstigatingSource::Path(path) => fs::remove_file(path).unwrap(), + InstigatingSource::ProjectNode(_, _, _, _) => { log::warn!( "Cannot remove instance {:?}, it's from a project file", id @@ -252,18 +220,12 @@ impl JobThreadContext { match instigating_source { InstigatingSource::Path(path) => { if let Some(Variant::String(value)) = changed_value { - if let Err(err) = fs::write(path, value) { - log::error!( - "Failed to write file {}: {}", - path.display(), - err - ); - } + fs::write(path, value).unwrap(); } else { log::warn!("Cannot change Source to non-string value."); } } - InstigatingSource::ProjectNode { .. } => { + InstigatingSource::ProjectNode(_, _, _, _) => { log::warn!( "Cannot remove instance {:?}, it's from a project file", id @@ -288,9 +250,7 @@ impl JobThreadContext { apply_patch_set(&mut tree, patch_set) }; - if !applied_patch.is_empty() { - self.message_queue.push_messages(&[applied_patch]); - } + self.message_queue.push_messages(&[applied_patch]); } } @@ -320,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..f1cc6d1e 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. @@ -194,15 +95,25 @@ fn write_model( rbx_xml::to_writer(&mut file, tree.inner(), top_level_ids, xml_encode_config())?; } + OutputKind::Rbxm => { + rbx_binary::to_writer_default(&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_default(&mut file, tree.inner(), top_level_ids)?; + } } 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..376d69db 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::to_writer_default(&mut file, tree.inner(), &[root_id])?; 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..0846e6bc 100644 --- a/src/cli/upload.rs +++ b/src/cli/upload.rs @@ -1,93 +1,46 @@ -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 = inner_tree.root(); - let encode_ids = match root.class.as_str() { - "DataModel" => root.children().to_vec(), - _ => vec![root.referent()], - }; + let encode_ids = match root.class.as_str() { + "DataModel" => root.children().to_vec(), + _ => vec![root.referent()], + }; - 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)?; - - 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"); - } - } - } + log::trace!("Encoding binary model"); + rbx_binary::to_writer_default(&mut buffer, tree.inner(), &encode_ids)?; + do_upload(buffer, options.asset_id, &cookie) } fn do_upload(buffer: Vec, asset_id: u64, cookie: &str) -> anyhow::Result<()> { @@ -96,7 +49,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 +76,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..51195b6c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,31 +10,18 @@ mod tree_view; mod auth_cookie; mod change_processor; mod glob; -mod json; mod lua_ast; mod message_queue; mod multimap; mod path_serializer; mod project; mod resolution; -mod rojo_ref; mod serve_session; mod session_id; mod snapshot; mod snapshot_middleware; -mod syncback; -mod variant_eq; mod web; -// TODO: Work out what we should expose publicly - pub use project::*; -pub use rojo_ref::*; pub use session_id::SessionId; -pub use snapshot::{ - InstanceContext, InstanceMetadata, InstanceSnapshot, InstanceWithMeta, InstanceWithMetaMut, - RojoDescendants, RojoTree, -}; -pub use snapshot_middleware::{snapshot_from_vfs, Middleware, ScriptType}; -pub use syncback::{syncback_loop, FsSnapshot, SyncbackData, SyncbackSnapshot}; pub use web::interface as web_api; diff --git a/src/lua_ast.rs b/src/lua_ast.rs index 6734e8c6..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..438f3210 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,23 +1,15 @@ use std::{ - collections::{BTreeMap, HashSet}, - ffi::OsStr, + collections::{BTreeMap, HashMap, HashSet}, fs, io, - net::IpAddr, path::{Path, PathBuf}, }; -use memofs::Vfs; -use rbx_dom_weak::Ustr; use serde::{Deserialize, Serialize}; use thiserror::Error; -use crate::{ - glob::IgnorableGlob, json, resolution::UnresolvedValue, snapshot::SyncRule, - syncback::SyncbackRules, -}; +use crate::{glob::Glob, resolution::UnresolvedValue}; -/// Represents 'default' project names that act as `init` files -pub static DEFAULT_PROJECT_NAMES: [&str; 2] = ["default.project.json", "default.project.jsonc"]; +static PROJECT_FILENAME: &str = "default.project.json"; /// Error type returned by any function that handles projects. #[derive(Debug, Error)] @@ -26,21 +18,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 +37,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 +57,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 +74,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 +92,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 +158,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 +168,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 +180,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 +208,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 +233,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 index 47fbac7e..d713cc14 100644 --- a/src/resolution.rs +++ b/src/resolution.rs @@ -1,21 +1,10 @@ -use std::borrow::Borrow; - -use anyhow::{bail, format_err}; +use anyhow::format_err; use rbx_dom_weak::types::{ - Attributes, CFrame, Color3, Content, ContentId, ContentType, Enum, Font, MaterialColors, - Matrix3, Tags, Variant, VariantType, Vector2, Vector3, + Color3, Color3uint8, Content, Enum, 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 { @@ -30,105 +19,6 @@ impl UnresolvedValue { UnresolvedValue::Ambiguous(partial) => partial.resolve(class_name, prop_name), } } - - pub fn resolve_unambiguous(self) -> anyhow::Result { - match self { - UnresolvedValue::FullyQualified(full) => Ok(full), - UnresolvedValue::Ambiguous(partial) => partial.resolve_unambiguous(), - } - } - - /// Creates an `UnresolvedValue` from a variant, using a class and property - /// name to potentially allow for ambiguous Enum variants. - pub fn from_variant(variant: Variant, class_name: &str, prop_name: &str) -> Self { - let descriptor = find_descriptor(class_name, prop_name); - if descriptor.is_some() { - // We can only use an ambiguous syntax if the property is known - // to the reflection database. - Self::Ambiguous(match variant { - Variant::Enum(rbx_enum) => { - if let Some(property) = descriptor { - if let DataType::Enum(enum_name) = &property.data_type { - let database = rbx_reflection_database::get().unwrap(); - if let Some(enum_descriptor) = database.enums.get(enum_name) { - for (variant_name, id) in &enum_descriptor.items { - if *id == rbx_enum.to_u32() { - return Self::Ambiguous(AmbiguousValue::String( - variant_name.to_string(), - )); - } - } - } - } - } - return Self::FullyQualified(variant); - } - Variant::Bool(bool) => AmbiguousValue::Bool(bool), - Variant::Float32(n) => AmbiguousValue::Number(n as f64), - Variant::Float64(n) => AmbiguousValue::Number(n), - Variant::Int32(n) => AmbiguousValue::Number(n as f64), - Variant::Int64(n) => AmbiguousValue::Number(n as f64), - Variant::String(str) => AmbiguousValue::String(str), - Variant::Tags(tags) => { - AmbiguousValue::StringArray(tags.iter().map(|s| s.to_string()).collect()) - } - Variant::Content(ref content) => match content.value() { - ContentType::None => AmbiguousValue::String(String::new()), - ContentType::Uri(uri) => AmbiguousValue::String(uri.clone()), - _ => return Self::FullyQualified(variant), - }, - Variant::ContentId(content) => AmbiguousValue::String(content.into_string()), - Variant::Vector2(vector) => { - AmbiguousValue::Array2([vector.x as f64, vector.y as f64]) - } - Variant::Vector3(vector) => { - AmbiguousValue::Array3([vector.x as f64, vector.y as f64, vector.z as f64]) - } - Variant::Color3(color) => { - AmbiguousValue::Array3([color.r as f64, color.g as f64, color.b as f64]) - } - Variant::CFrame(cf) => AmbiguousValue::Array12([ - cf.position.x as f64, - cf.position.y as f64, - cf.position.z as f64, - cf.orientation.x.x as f64, - cf.orientation.x.y as f64, - cf.orientation.x.z as f64, - cf.orientation.y.x as f64, - cf.orientation.y.y as f64, - cf.orientation.y.z as f64, - cf.orientation.z.x as f64, - cf.orientation.z.y as f64, - cf.orientation.z.z as f64, - ]), - Variant::Attributes(attr) => AmbiguousValue::Attributes(attr), - Variant::Font(font) => AmbiguousValue::Font(font), - Variant::MaterialColors(colors) => AmbiguousValue::MaterialColors(colors), - _ => { - return Self::FullyQualified(variant); - } - }) - } else { - Self::FullyQualified(variant) - } - } - - /// Creates an `UnresolvedValue` from a variant, only returning ambiguous - /// values if they're able to be resolved in a context-free environment. - pub fn from_variant_unambiguous(variant: Variant) -> Self { - match variant { - Variant::String(str) => Self::Ambiguous(AmbiguousValue::String(str)), - Variant::Float64(number) => Self::Ambiguous(AmbiguousValue::Number(number)), - Variant::Bool(bool) => Self::Ambiguous(AmbiguousValue::Bool(bool)), - Variant::BinaryString(bstr) => match std::str::from_utf8(bstr.as_ref()) { - Ok(_) => Self::Ambiguous(AmbiguousValue::String( - String::from_utf8(bstr.into_vec()).unwrap(), - )), - Err(_) => Self::FullyQualified(Variant::BinaryString(bstr)), - }, - _ => Self::FullyQualified(variant), - } - } } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] @@ -136,15 +26,10 @@ impl UnresolvedValue { 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 { @@ -154,21 +39,20 @@ impl AmbiguousValue { match &property.data_type { DataType::Enum(enum_name) => { - let database = rbx_reflection_database::get().unwrap(); + let database = rbx_reflection_database::get(); let enum_descriptor = database.enums.get(enum_name).ok_or_else(|| { format_err!("Unknown enum {}. This is a Rojo bug!", enum_name) })?; let error = |what: &str| { - let mut all_values = enum_descriptor + let sample_values = enum_descriptor .items .keys() - .map(|value| value.borrow()) - .collect::>(); - all_values.sort(); - - let examples = nonexhaustive_list(&all_values); + .take(3) + .map(|name| format!(r#""{}""#, name)) + .collect::>() + .join(", "); format_err!( "Invalid value for property {}.{}. Got {} but \ @@ -177,7 +61,7 @@ impl AmbiguousValue { prop_name, what, enum_name, - examples, + sample_values ) }; @@ -202,15 +86,9 @@ impl AmbiguousValue { (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()) @@ -223,31 +101,16 @@ impl AmbiguousValue { (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]), + (VariantType::Color3uint8, AmbiguousValue::Array3(value)) => { + let value = Color3uint8::new( + (value[0] / 255.0) as u8, + (value[1] / 255.0) as u8, + (value[2] / 255.0) as u8, ); - Ok(CFrame::new(pos, orientation).into()) - } - - (VariantType::Attributes, AmbiguousValue::Attributes(value)) => Ok(value.into()), - - (VariantType::Font, AmbiguousValue::Font(value)) => Ok(value.into()), - - (VariantType::MaterialColors, AmbiguousValue::MaterialColors(value)) => { Ok(value.into()) } - (VariantType::Ref, AmbiguousValue::String(_)) => Err(format_err!( - "Cannot resolve Ref properties as a String.\ - Use an attribute named `{REF_POINTER_ATTRIBUTE_PREFIX}{prop_name}" - )), (_, unresolved) => Err(format_err!( "Wrong type of value for property {}.{}. Expected {:?}, got {}", class_name, @@ -264,29 +127,14 @@ impl AmbiguousValue { } } - pub fn resolve_unambiguous(self) -> anyhow::Result { - match self { - AmbiguousValue::Bool(value) => Ok(value.into()), - AmbiguousValue::Number(value) => Ok(value.into()), - AmbiguousValue::String(value) => Ok(value.into()), - - other => bail!("Cannot unambiguously resolve the value {other:?}"), - } - } - fn describe(&self) -> &'static str { match self { AmbiguousValue::Bool(_) => "a bool", 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", } } } @@ -295,7 +143,7 @@ fn find_descriptor( class_name: &str, prop_name: &str, ) -> Option<&'static PropertyDescriptor<'static>> { - let database = rbx_reflection_database::get().unwrap(); + let database = rbx_reflection_database::get(); let mut current_class_name = class_name; loop { @@ -304,192 +152,6 @@ fn find_descriptor( 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) - ) + current_class_name = class.superclass.as_deref()?; } } 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..aec152d0 100644 --- a/src/serve_session.rs +++ b/src/serve_session.rs @@ -1,13 +1,14 @@ use std::{ + borrow::Cow, collections::HashSet, io, - net::IpAddr, - path::Path, + path::{Path, PathBuf}, sync::{Arc, Mutex, MutexGuard}, time::Instant, }; use crossbeam_channel::Sender; +use memofs::IoResultExt; use memofs::Vfs; use thiserror::Error; @@ -23,9 +24,7 @@ use crate::{ 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 +94,41 @@ impl ServeSession { /// currently loaded from the filesystem directly instead of through the /// in-memory filesystem layer. pub fn new>(vfs: Vfs, start_path: P) -> Result { + let start_path = start_path.as_ref(); let start_time = Instant::now(); - let start_path = vfs.canonicalize(start_path.as_ref())?; - let start_path = start_path.as_path(); log::trace!("Starting new ServeSession at path {}", start_path.display()); - let root_project = Project::load_initial_project(&vfs, start_path)?; + let project_path; + if Project::is_project_file(start_path) { + project_path = Cow::Borrowed(start_path); + } else { + project_path = Cow::Owned(start_path.join("default.project.json")); + } + + log::debug!("Loading project file from {}", project_path.display()); + + let root_project = match vfs.read(&project_path).with_not_found()? { + Some(contents) => Project::load_from_slice(&contents, &project_path)?, + None => { + return Err(ServeSessionError::NoProjectFound { + path: project_path.to_path_buf(), + }); + } + }; let mut tree = RojoTree::new(InstanceSnapshot::new()); let root_id = tree.get_root_id(); - let instance_context = - InstanceContext::with_emit_legacy_scripts(root_project.emit_legacy_scripts); + let instance_context = InstanceContext::default(); log::trace!("Generating snapshot of instances from VFS"); - let snapshot = snapshot_from_vfs(&instance_context, &vfs, start_path)?; + let snapshot = snapshot_from_vfs(&instance_context, &vfs, &start_path)? + .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 +188,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 +202,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 +231,3 @@ pub enum ServeSessionError { source: anyhow::Error, }, } - -#[cfg(test)] -mod test { - use super::*; - - use memofs::StdBackend; - - #[test] - fn tree_is_keyed_by_canonical_paths() { - let dir = tempfile::tempdir().unwrap(); - std::fs::write( - dir.path().join("default.project.json"), - r#"{ "name": "test", "tree": { "$className": "Folder" } }"#, - ) - .unwrap(); - - // `std::fs::canonicalize` yields a verbatim path on Windows. - // On other platforms it simply resolves the path (e.g. symlinks), - // which the session must also handle. - let start_path = std::fs::canonicalize(dir.path()).unwrap(); - - let vfs = Vfs::new(StdBackend::new().unwrap()); - let session = ServeSession::new(vfs, &start_path).unwrap(); - - let project_file = start_path.join("default.project.json"); - let canonical = session.vfs().canonicalize(&project_file).unwrap(); - - assert!( - !session.tree().get_ids_at_path(&canonical).is_empty(), - "project file {} should be tracked in the tree under its canonical \ - path {}, matching what the watcher reports", - project_file.display(), - canonical.display(), - ); - } -} diff --git a/src/snapshot/instance_snapshot.rs b/src/snapshot/instance_snapshot.rs index 6a9331fd..050dc067 100644 --- a/src/snapshot/instance_snapshot.rs +++ b/src/snapshot/instance_snapshot.rs @@ -1,10 +1,10 @@ //! Defines the structure of an instance snapshot. -use std::borrow::Cow; +use std::{borrow::Cow, collections::HashMap}; use rbx_dom_weak::{ types::{Ref, Variant}, - ustr, AHashMap, HashMapExt as _, Instance, Ustr, UstrMap, WeakDom, + WeakDom, }; use serde::{Deserialize, Serialize}; @@ -17,8 +17,9 @@ use super::InstanceMetadata; // - Replace use of Variant with a sum of Variant + borrowed value #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct InstanceSnapshot { + // FIXME: Don't use Option anymore! /// A temporary ID applied to the snapshot that's used for Ref properties. - pub snapshot_id: Ref, + pub snapshot_id: Option, /// Rojo-specific metadata associated with the instance. pub metadata: InstanceMetadata, @@ -27,10 +28,10 @@ pub struct InstanceSnapshot { pub name: Cow<'static, str>, /// Corresponds to the ClassName property of the instance. - pub class_name: Ustr, + pub class_name: Cow<'static, str>, /// All other properties of the instance, weakly-typed. - pub properties: UstrMap, + pub properties: HashMap, /// The children of the instance represented as more snapshots. /// @@ -41,11 +42,11 @@ pub struct InstanceSnapshot { impl InstanceSnapshot { pub fn new() -> Self { Self { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: InstanceMetadata::default(), name: Cow::Borrowed("DEFAULT"), - class_name: ustr("DEFAULT"), - properties: UstrMap::new(), + class_name: Cow::Borrowed("DEFAULT"), + properties: HashMap::new(), children: Vec::new(), } } @@ -57,23 +58,23 @@ impl InstanceSnapshot { } } - pub fn class_name>(self, class_name: S) -> Self { + pub fn class_name(self, class_name: impl Into) -> Self { Self { - class_name: class_name.into(), + class_name: Cow::Owned(class_name.into()), ..self } } pub fn property(mut self, key: K, value: V) -> Self where - K: Into, + K: Into, V: Into, { self.properties.insert(key.into(), value.into()); self } - pub fn properties(self, properties: impl Into>) -> Self { + pub fn properties(self, properties: impl Into>) -> Self { Self { properties: properties.into(), ..self @@ -87,7 +88,7 @@ impl InstanceSnapshot { } } - pub fn snapshot_id(self, snapshot_id: Ref) -> Self { + pub fn snapshot_id(self, snapshot_id: Option) -> Self { Self { snapshot_id, ..self @@ -101,29 +102,22 @@ impl InstanceSnapshot { } } - #[profiling::function] - pub fn from_tree(tree: WeakDom, id: Ref) -> Self { - let (_, mut raw_tree) = tree.into_raw(); - Self::from_raw_tree(&mut raw_tree, id) - } - - fn from_raw_tree(raw_tree: &mut AHashMap, id: Ref) -> Self { - let instance = raw_tree - .remove(&id) - .expect("instance did not exist in tree"); + pub fn from_tree(tree: &WeakDom, id: Ref) -> Self { + let instance = tree.get_by_ref(id).expect("instance did not exist in tree"); let children = instance .children() .iter() - .map(|&id| Self::from_raw_tree(raw_tree, id)) + .copied() + .map(|id| Self::from_tree(tree, id)) .collect(); Self { - snapshot_id: id, + snapshot_id: Some(id), metadata: InstanceMetadata::default(), - name: Cow::Owned(instance.name), - class_name: instance.class, - properties: instance.properties, + name: Cow::Owned(instance.name.clone()), + class_name: Cow::Owned(instance.class.clone()), + properties: instance.properties.clone(), children, } } diff --git a/src/snapshot/metadata.rs b/src/snapshot/metadata.rs index a1bf0afe..192a0001 100644 --- a/src/snapshot/metadata.rs +++ b/src/snapshot/metadata.rs @@ -4,16 +4,9 @@ use std::{ sync::Arc, }; -use anyhow::Context; use serde::{Deserialize, Serialize}; -use crate::{ - glob::{Glob, IgnorableGlob}, - path_serializer, - project::ProjectNode, - snapshot_middleware::{emit_legacy_scripts_default, Middleware}, - RojoRef, -}; +use crate::{glob::Glob, path_serializer, project::ProjectNode}; /// Rojo-specific metadata that can be associated with an instance or a snapshot /// of an instance. @@ -59,17 +52,6 @@ pub struct InstanceMetadata { /// that instance's instigating source is snapshotted directly, the same /// context will be passed into it. pub context: InstanceContext, - - /// Indicates the ID used for Ref properties pointing to this Instance. - pub specified_id: Option, - - /// The Middleware that was used to create this Instance. Should generally - /// not be `None` except if the snapshotting process is not completed. - pub middleware: Option, - - /// A schema provided via a JSON file, if one exists. Will be `None` for - /// all non-JSON middleware. - pub schema: Option, } impl InstanceMetadata { @@ -79,9 +61,6 @@ impl InstanceMetadata { instigating_source: None, relevant_paths: Vec::new(), context: InstanceContext::default(), - specified_id: None, - middleware: None, - schema: None, } } @@ -112,24 +91,6 @@ impl InstanceMetadata { ..self } } - - pub fn specified_id(self, id: Option) -> Self { - Self { - specified_id: id, - ..self - } - } - - pub fn middleware(self, middleware: Middleware) -> Self { - Self { - middleware: Some(middleware), - ..self - } - } - - pub fn schema(self, schema: Option) -> Self { - Self { schema, ..self } - } } impl Default for InstanceMetadata { @@ -142,29 +103,9 @@ impl Default for InstanceMetadata { pub struct InstanceContext { #[serde(skip_serializing_if = "Vec::is_empty")] pub path_ignore_rules: Arc>, - pub emit_legacy_scripts: bool, - #[serde(skip_serializing_if = "Vec::is_empty")] - pub sync_rules: Vec, } impl InstanceContext { - pub fn new() -> Self { - Self { - path_ignore_rules: Arc::new(Vec::new()), - emit_legacy_scripts: emit_legacy_scripts_default().unwrap(), - sync_rules: Vec::new(), - } - } - - pub fn with_emit_legacy_scripts(emit_legacy_scripts: Option) -> Self { - Self { - emit_legacy_scripts: emit_legacy_scripts - .or_else(emit_legacy_scripts_default) - .unwrap(), - ..Self::new() - } - } - /// Extend the list of ignore rules in the context with the given new rules. pub fn add_path_ignore_rules(&mut self, new_rules: I) where @@ -182,34 +123,13 @@ impl InstanceContext { let rules = Arc::make_mut(&mut self.path_ignore_rules); rules.extend(new_rules); } - - /// Extend the list of syncing rules in the context with the given new rules. - pub fn add_sync_rules(&mut self, new_rules: I) - where - I: IntoIterator, - { - self.sync_rules.extend(new_rules); - } - - /// Clears all sync rules for this InstanceContext - pub fn clear_sync_rules(&mut self) { - self.sync_rules.clear(); - } - - pub fn set_emit_legacy_scripts(&mut self, emit_legacy_scripts: bool) { - self.emit_legacy_scripts = emit_legacy_scripts; - } - - /// Returns the middleware specified by the first sync rule that - /// matches the provided path. This does not handle default syncing rules. - pub fn get_user_sync_rule(&self, path: &Path) -> Option<&SyncRule> { - self.sync_rules.iter().find(|&rule| rule.matches(path)) - } } impl Default for InstanceContext { fn default() -> Self { - Self::new() + InstanceContext { + path_ignore_rules: Arc::new(Vec::new()), + } } } @@ -222,73 +142,36 @@ pub struct PathIgnoreRule { pub base_path: PathBuf, /// The actual glob that can be matched against the input path. - pub glob: IgnorableGlob, + pub glob: Glob, } impl PathIgnoreRule { - pub fn matches>(&self, path: P) -> bool { + pub fn passes>(&self, path: P) -> bool { let path = path.as_ref(); match path.strip_prefix(&self.base_path) { - Ok(suffix) => self.glob.is_match(suffix), - Err(_) => false, + Ok(suffix) => !self.glob.is_match(suffix), + Err(_) => true, } } - - pub fn is_negation(&self) -> bool { - self.glob.is_negation() - } } -/// Evaluates an ordered list of [`PathIgnoreRule`]s against a path using -/// gitignore-style "last match wins" semantics: a path is ignored if the last -/// rule whose pattern matches it is non-negated. Paths matched by no rule are -/// not ignored. -pub fn is_path_ignored>(rules: &[PathIgnoreRule], path: P) -> bool { - let path = path.as_ref(); - let mut ignored = false; - for rule in rules { - if rule.matches(path) { - ignored = !rule.is_negation(); - } - } - ignored -} - -/// Represents where a particular Instance or InstanceSnapshot came from. #[derive(Clone, PartialEq, Serialize, Deserialize)] pub enum InstigatingSource { - /// The path the Instance was made from. Path(#[serde(serialize_with = "path_serializer::serialize_absolute")] PathBuf), - /// The node in a Project that the Instance was made from. - ProjectNode { - #[serde(serialize_with = "path_serializer::serialize_absolute")] - path: PathBuf, - name: String, - node: ProjectNode, - parent_class: Option, - }, -} - -impl InstigatingSource { - pub fn path(&self) -> &Path { - match self { - Self::Path(path) => path.as_path(), - Self::ProjectNode { path, .. } => path.as_path(), - } - } + ProjectNode( + #[serde(serialize_with = "path_serializer::serialize_absolute")] PathBuf, + String, + ProjectNode, + Option, + ), } impl fmt::Debug for InstigatingSource { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { match self { InstigatingSource::Path(path) => write!(formatter, "Path({})", path.display()), - InstigatingSource::ProjectNode { - name, - node, - path, - parent_class, - } => write!( + InstigatingSource::ProjectNode(path, name, node, parent_class) => write!( formatter, "ProjectNode({}: {:?}) from path {} and parent class {:?}", name, @@ -311,64 +194,3 @@ impl From<&Path> for InstigatingSource { InstigatingSource::Path(path.to_path_buf()) } } - -/// Represents an user-specified rule for transforming files -/// into Instances using a given middleware. -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] -pub struct SyncRule { - /// A pattern used to determine if a file is included in this SyncRule - #[serde(rename = "pattern")] - pub include: Glob, - /// A pattern used to determine if a file is excluded from this SyncRule. - #[serde(skip_serializing_if = "Option::is_none")] - pub exclude: Option, - /// The middleware specified by the user for this SyncRule - #[serde(rename = "use")] - pub middleware: Middleware, - /// A suffix to trim off of file names, including the file extension. - /// If not specified, the file extension is the only thing cut off. - #[serde(skip_serializing_if = "Option::is_none")] - pub suffix: Option, - /// The 'base' of the glob above, allowing it to be used - /// relative to a path instead of absolute. - #[serde(skip)] - pub base_path: PathBuf, -} - -impl SyncRule { - /// Returns whether the given path matches this rule. - pub fn matches(&self, path: &Path) -> bool { - match path.strip_prefix(&self.base_path) { - Ok(suffix) => { - if let Some(pattern) = &self.exclude { - if pattern.is_match(suffix) { - return false; - } - } - self.include.is_match(suffix) - } - Err(_) => false, - } - } - - pub fn file_name_for_path<'a>(&self, path: &'a Path) -> anyhow::Result<&'a str> { - if let Some(suffix) = &self.suffix { - let file_name = path - .file_name() - .and_then(|s| s.to_str()) - .with_context(|| format!("file name of {} is invalid", path.display()))?; - if file_name.ends_with(suffix) { - let end = file_name.len().saturating_sub(suffix.len()); - Ok(&file_name[..end]) - } else { - Ok(file_name) - } - } else { - // If the user doesn't specify a suffix, we assume they just want - // the name of the file (the file_stem) - path.file_stem() - .and_then(|s| s.to_str()) - .with_context(|| format!("file name of {} is invalid", path.display())) - } - } -} diff --git a/src/snapshot/patch.rs b/src/snapshot/patch.rs index e8899357..1d320a2c 100644 --- a/src/snapshot/patch.rs +++ b/src/snapshot/patch.rs @@ -1,9 +1,8 @@ //! Defines the data structures used for describing instance patches. -use rbx_dom_weak::{ - types::{Ref, Variant}, - HashMapExt as _, Ustr, UstrMap, -}; +use std::collections::HashMap; + +use rbx_dom_weak::types::{Ref, Variant}; use serde::{Deserialize, Serialize}; use super::{InstanceMetadata, InstanceSnapshot}; @@ -20,7 +19,7 @@ pub struct PatchSet { pub updated_instances: Vec, } -impl PatchSet { +impl<'a> PatchSet { pub fn new() -> Self { PatchSet { removed_instances: Vec::new(), @@ -42,11 +41,11 @@ pub struct PatchAdd { pub struct PatchUpdate { pub id: Ref, pub changed_name: Option, - pub changed_class_name: Option, + pub changed_class_name: Option, /// Contains all changed properties. If a property is assigned to `None`, /// then that property has been removed. - pub changed_properties: UstrMap>, + pub changed_properties: HashMap>, /// Changed Rojo-specific metadata, if any of it changed. pub changed_metadata: Option, @@ -77,10 +76,6 @@ impl AppliedPatchSet { updated: Vec::new(), } } - - pub fn is_empty(&self) -> bool { - self.removed.is_empty() && self.added.is_empty() && self.updated.is_empty() - } } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -89,8 +84,8 @@ pub struct AppliedPatchUpdate { // TODO: Store previous values in order to detect application conflicts pub changed_name: Option, - pub changed_class_name: Option, - pub changed_properties: UstrMap>, + pub changed_class_name: Option, + pub changed_properties: HashMap>, pub changed_metadata: Option, } @@ -100,7 +95,7 @@ impl AppliedPatchUpdate { id, changed_name: None, changed_class_name: None, - changed_properties: UstrMap::new(), + changed_properties: HashMap::new(), changed_metadata: None, } } diff --git a/src/snapshot/patch_apply.rs b/src/snapshot/patch_apply.rs index 8427c1a1..4e40061c 100644 --- a/src/snapshot/patch_apply.rs +++ b/src/snapshot/patch_apply.rs @@ -1,49 +1,32 @@ //! Defines the algorithm for applying generated patches. -use std::{ - collections::{HashMap, HashSet}, - mem::take, -}; +use std::collections::HashMap; -use rbx_dom_weak::{ - types::{Ref, Variant}, - ustr, Ustr, -}; +use rbx_dom_weak::types::{Ref, Variant}; use super::{ patch::{AppliedPatchSet, AppliedPatchUpdate, PatchSet, PatchUpdate}, InstanceSnapshot, RojoTree, }; -use crate::{multimap::MultiMap, RojoRef, REF_ID_ATTRIBUTE_NAME, REF_POINTER_ATTRIBUTE_PREFIX}; /// Consumes the input `PatchSet`, applying all of its prescribed changes to the /// tree and returns an `AppliedPatchSet`, which can be used to keep another /// tree in sync with Rojo's. -#[profiling::function] pub fn apply_patch_set(tree: &mut RojoTree, patch_set: PatchSet) -> AppliedPatchSet { let mut context = PatchApplyContext::default(); - { - profiling::scope!("removals"); - for removed_id in patch_set.removed_instances { - apply_remove_instance(&mut context, tree, removed_id); - } + for removed_id in patch_set.removed_instances { + apply_remove_instance(&mut context, tree, removed_id); } - { - profiling::scope!("additions"); - for add_patch in patch_set.added_instances { - apply_add_child(&mut context, tree, add_patch.parent_id, add_patch.instance); - } + for add_patch in patch_set.added_instances { + apply_add_child(&mut context, tree, add_patch.parent_id, add_patch.instance); } - { - profiling::scope!("updates"); - // Updates need to be applied after additions, which reduces the complexity - // of updates significantly. - for update_patch in patch_set.updated_instances { - apply_update_child(&mut context, tree, update_patch); - } + // Updates need to be applied after additions, which reduces the complexity + // of updates significantly. + for update_patch in patch_set.updated_instances { + apply_update_child(&mut context, tree, update_patch); } finalize_patch_application(context, tree) @@ -72,14 +55,20 @@ struct PatchApplyContext { /// eachother. snapshot_id_to_instance_id: HashMap, - /// Tracks all of the instances added by this patch that have refs that need - /// to be rewritten. - has_refs_to_rewrite: HashSet, - - /// Tracks all ref properties that were specified using attributes. This has - /// to be handled after everything else is done just like normal referent - /// properties. - attribute_refs_to_rewrite: MultiMap, + /// The properties of instances added by the current `PatchSet`. + /// + /// Instances added to the tree can refer to eachother via Ref properties, + /// but we need to make sure they're correctly transformed from snapshot + /// space into tree space (via `snapshot_id_to_instance_id`). + /// + /// It's not possible to do that transformation for refs that refer to added + /// instances until all the instances have actually been inserted into the + /// tree. For simplicity, we defer application of _all_ properties on added + /// instances instead of just Refs. + /// + /// This doesn't affect updated instances, since they're always applied + /// after we've added all the instances from the patch. + added_instance_properties: HashMap>, /// The current applied patch result, describing changes made to the tree. applied_patch_set: AppliedPatchSet, @@ -95,38 +84,24 @@ struct PatchApplyContext { /// The remaining Ref properties need to be handled during patch application, /// where we build up a map of snapshot IDs to instance IDs as they're created, /// then apply properties all at once at the end. -#[profiling::function] fn finalize_patch_application(context: PatchApplyContext, tree: &mut RojoTree) -> AppliedPatchSet { - for id in context.has_refs_to_rewrite { + for (id, properties) in context.added_instance_properties { // This should always succeed since instances marked as added in our // patch should be added without fail. let mut instance = tree .get_instance_mut(id) .expect("Invalid instance ID in deferred property map"); - for value in instance.properties_mut().values_mut() { - if let Variant::Ref(referent) = value { - if let Some(&instance_referent) = context.snapshot_id_to_instance_id.get(referent) { - *value = Variant::Ref(instance_referent); + for (key, mut property_value) in properties { + if let Variant::Ref(referent) = property_value { + if let Some(&instance_referent) = context.snapshot_id_to_instance_id.get(&referent) + { + property_value = Variant::Ref(instance_referent); } } - } - } - // This is to get around the fact that `RojoTre::get_specified_id` borrows - // the tree as immutable, but we need to hold a mutable reference to it. - // Not exactly elegant, but it does the job. - let mut real_rewrites = Vec::new(); - for (id, map) in context.attribute_refs_to_rewrite { - for (prop_name, prop_value) in map { - if let Some(target) = tree.get_specified_id(&RojoRef::new(prop_value)) { - real_rewrites.push((prop_name, Variant::Ref(target))) - } + instance.properties_mut().insert(key, property_value); } - let mut instance = tree - .get_instance_mut(id) - .expect("Invalid instance ID in deferred attribute ref map"); - instance.properties_mut().extend(real_rewrites.drain(..)); } context.applied_patch_set @@ -141,34 +116,32 @@ fn apply_add_child( context: &mut PatchApplyContext, tree: &mut RojoTree, parent_id: Ref, - mut snapshot: InstanceSnapshot, + snapshot: InstanceSnapshot, ) { let snapshot_id = snapshot.snapshot_id; - let children = take(&mut snapshot.children); + let properties = snapshot.properties; + let children = snapshot.children; - // If an object we're adding has a non-null referent, we'll note this - // instance down as needing to be revisited later. - let has_refs = snapshot.properties.values().any(|value| match value { - Variant::Ref(value) => value.is_some(), - _ => false, - }); + // Property application is deferred until after all children + // are constructed. This helps apply referents correctly. + let remaining_snapshot = InstanceSnapshot::new() + .name(snapshot.name) + .class_name(snapshot.class_name) + .metadata(snapshot.metadata) + .snapshot_id(snapshot.snapshot_id); - let id = tree.insert_instance(parent_id, snapshot); + let id = tree.insert_instance(parent_id, remaining_snapshot); context.applied_patch_set.added.push(id); - if has_refs { - context.has_refs_to_rewrite.insert(id); - } + context.added_instance_properties.insert(id, properties); - if snapshot_id.is_some() { + if let Some(snapshot_id) = snapshot_id { context.snapshot_id_to_instance_id.insert(snapshot_id, id); } for child in children { apply_add_child(context, tree, id, child); } - - defer_ref_properties(tree, id, context); } fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patch: PatchUpdate) { @@ -196,7 +169,7 @@ fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patc } if let Some(class_name) = patch.changed_class_name { - instance.set_class_name(class_name); + *instance.class_name_mut() = class_name.clone(); applied_patch.changed_class_name = Some(class_name); } @@ -222,10 +195,10 @@ fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patc instance .properties_mut() - .insert(key, Variant::Ref(new_referent)); + .insert(key.clone(), Variant::Ref(new_referent)); } Some(ref value) => { - instance.properties_mut().insert(key, value.clone()); + instance.properties_mut().insert(key.clone(), value.clone()); } None => { instance.properties_mut().remove(&key); @@ -235,79 +208,17 @@ fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patc applied_patch.changed_properties.insert(key, property_entry); } - defer_ref_properties(tree, patch.id, context); - context.applied_patch_set.updated.push(applied_patch) } -/// Calculates manually-specified Ref properties and marks them in the provided -/// `PatchApplyContext` to be rewritten at the end of the patch application -/// process. -/// -/// Currently, this only uses attributes but it can easily handle rewriting -/// referents in other ways too! -fn defer_ref_properties(tree: &mut RojoTree, id: Ref, context: &mut PatchApplyContext) { - let instance = tree - .get_instance(id) - .expect("Instances should exist when calculating deferred refs"); - let attributes = match instance.properties().get(&ustr("Attributes")) { - Some(Variant::Attributes(attrs)) => attrs, - _ => return, - }; - - let mut attr_id = None; - for (attr_name, attr_value) in attributes.iter() { - if attr_name == REF_ID_ATTRIBUTE_NAME { - if let Variant::String(specified_id) = attr_value { - attr_id = Some(RojoRef::new(specified_id.clone())); - } else if let Variant::BinaryString(specified_id) = attr_value { - if let Ok(str) = std::str::from_utf8(specified_id.as_ref()) { - attr_id = Some(RojoRef::new(str.to_string())) - } else { - log::error!("Specified IDs must be valid UTF-8 strings.") - } - } else { - log::warn!( - "Attribute {attr_name} is of type {:?} when it was \ - expected to be a String", - attr_value.ty() - ) - } - } - if let Some(prop_name) = attr_name.strip_prefix(REF_POINTER_ATTRIBUTE_PREFIX) { - if let Variant::String(prop_value) = attr_value { - context - .attribute_refs_to_rewrite - .insert(id, (ustr(prop_name), prop_value.clone())); - } else if let Variant::BinaryString(prop_value) = attr_value { - if let Ok(str) = std::str::from_utf8(prop_value.as_ref()) { - context - .attribute_refs_to_rewrite - .insert(id, (ustr(prop_name), str.to_string())); - } else { - log::error!("IDs specified by referent property attributes must be valid UTF-8 strings.") - } - } else { - log::warn!( - "Attribute {attr_name} is of type {:?} when it was \ - expected to be a String", - attr_value.ty() - ) - } - } - } - if let Some(specified_id) = attr_id { - tree.set_specified_id(id, specified_id); - } -} - #[cfg(test)] mod test { use super::*; use std::borrow::Cow; - use rbx_dom_weak::{types::Variant, UstrMap}; + use maplit::hashmap; + use rbx_dom_weak::types::Variant; use super::super::PatchAdd; @@ -320,11 +231,13 @@ mod test { let root_id = tree.get_root_id(); let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("Foo"), - class_name: ustr("Bar"), - properties: UstrMap::from_iter([(ustr("Baz"), Variant::Int32(5))]), + class_name: Cow::Borrowed("Bar"), + properties: hashmap! { + "Baz".to_owned() => Variant::Int32(5), + }, children: Vec::new(), }; @@ -343,7 +256,7 @@ mod test { let child_instance = tree.get_instance(child_id).unwrap(); assert_eq!(child_instance.name(), &snapshot.name); - assert_eq!(child_instance.class_name(), snapshot.class_name); + assert_eq!(child_instance.class_name(), &snapshot.class_name); assert_eq!(child_instance.properties(), &snapshot.properties); assert!(child_instance.children().is_empty()); } @@ -366,15 +279,17 @@ mod test { let patch = PatchUpdate { id: root_id, changed_name: Some("Foo".to_owned()), - changed_class_name: Some(ustr("NewClassName")), - changed_properties: UstrMap::from_iter([ + changed_class_name: Some("NewClassName".to_owned()), + changed_properties: hashmap! { // The value of Foo has changed - (ustr("Foo"), Some(Variant::Int32(8))), + "Foo".to_owned() => Some(Variant::Int32(8)), + // Bar has been deleted - (ustr("Bar"), None), + "Bar".to_owned() => None, + // Baz has been added - (ustr("Baz"), Some(Variant::Int32(10))), - ]), + "Baz".to_owned() => Some(Variant::Int32(10)), + }, changed_metadata: None, }; @@ -385,11 +300,11 @@ mod test { apply_patch_set(&mut tree, patch_set); - let expected_properties = UstrMap::from_iter([ - (ustr("Foo"), Variant::Int32(8)), - (ustr("Baz"), Variant::Int32(10)), - (ustr("Unchanged"), Variant::Int32(-5)), - ]); + let expected_properties = hashmap! { + "Foo".to_owned() => Variant::Int32(8), + "Baz".to_owned() => Variant::Int32(10), + "Unchanged".to_owned() => Variant::Int32(-5), + }; let root_instance = tree.get_instance(root_id).unwrap(); assert_eq!(root_instance.name(), "Foo"); diff --git a/src/snapshot/patch_compute.rs b/src/snapshot/patch_compute.rs index 412c677a..39974caf 100644 --- a/src/snapshot/patch_compute.rs +++ b/src/snapshot/patch_compute.rs @@ -1,36 +1,25 @@ //! Defines the algorithm for computing a roughly-minimal patch set given an //! existing instance tree and an instance snapshot. -use std::{collections::HashMap, mem::take}; +use std::collections::{HashMap, HashSet}; -use rbx_dom_weak::{ - types::{Ref, Variant}, - ustr, HashMapExt as _, UstrMap, UstrSet, -}; - -use crate::{variant_eq::variant_eq, RojoRef, REF_POINTER_ATTRIBUTE_PREFIX}; +use rbx_dom_weak::types::{Ref, Variant}; use super::{ patch::{PatchAdd, PatchSet, PatchUpdate}, InstanceSnapshot, InstanceWithMeta, RojoTree, }; -#[profiling::function] -pub fn compute_patch_set(snapshot: Option, tree: &RojoTree, id: Ref) -> PatchSet { +pub fn compute_patch_set(snapshot: &InstanceSnapshot, tree: &RojoTree, id: Ref) -> 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 } @@ -74,123 +63,72 @@ fn rewrite_refs_in_snapshot(context: &ComputePatchContext, snapshot: &mut Instan fn compute_patch_set_internal( context: &mut ComputePatchContext, - mut snapshot: InstanceSnapshot, + snapshot: &InstanceSnapshot, tree: &RojoTree, id: Ref, patch_set: &mut PatchSet, ) { - if snapshot.snapshot_id.is_some() { - context - .snapshot_id_to_instance_id - .insert(snapshot.snapshot_id, id); + if let Some(snapshot_id) = snapshot.snapshot_id { + context.snapshot_id_to_instance_id.insert(snapshot_id, id); } let instance = tree .get_instance(id) .expect("Instance did not exist in tree"); - compute_property_patches(&mut snapshot, &instance, patch_set, tree); - compute_children_patches(context, &mut snapshot, tree, id, patch_set); + compute_property_patches(snapshot, &instance, patch_set); + compute_children_patches(context, snapshot, tree, id, patch_set); } fn compute_property_patches( - snapshot: &mut InstanceSnapshot, + snapshot: &InstanceSnapshot, instance: &InstanceWithMeta, patch_set: &mut PatchSet, - tree: &RojoTree, ) { - let mut visited_properties = UstrSet::default(); - let mut changed_properties = UstrMap::new(); - - let attribute_ref_properties = compute_ref_properties(snapshot, tree); + let mut visited_properties = HashSet::new(); + let mut changed_properties = HashMap::new(); let changed_name = if snapshot.name == instance.name() { None } else { - Some(take(&mut snapshot.name).into_owned()) + Some(snapshot.name.clone().into_owned()) }; let changed_class_name = if snapshot.class_name == instance.class_name() { None } else { - Some(take(&mut snapshot.class_name)) + Some(snapshot.class_name.clone().into_owned()) }; let changed_metadata = if &snapshot.metadata == instance.metadata() { None } else { - Some(take(&mut snapshot.metadata)) + Some(snapshot.metadata.clone()) }; - for (name, snapshot_value) in take(&mut snapshot.properties) { - visited_properties.insert(name); + for (name, snapshot_value) in &snapshot.properties { + visited_properties.insert(name.as_str()); - match instance.properties().get(&name) { + match instance.properties().get(name) { Some(instance_value) => { - if !variant_eq(&snapshot_value, instance_value) { - changed_properties.insert(name, Some(snapshot_value)); + if snapshot_value != instance_value { + changed_properties.insert(name.clone(), Some(snapshot_value.clone())); } } None => { - changed_properties.insert(name, Some(snapshot_value)); + changed_properties.insert(name.clone(), Some(snapshot_value.clone())); } } } for name in instance.properties().keys() { - if visited_properties.contains(name) { + if visited_properties.contains(name.as_str()) { continue; } - changed_properties.insert(*name, None); + changed_properties.insert(name.clone(), None); } - for (name, ref_value) in attribute_ref_properties { - match (&ref_value, instance.properties().get(&name)) { - (Some(referent), Some(instance_value)) => { - if referent != instance_value { - changed_properties.insert(name, ref_value); - } else { - changed_properties.remove(&name); - } - } - (Some(_), None) | (None, Some(_)) => { - changed_properties.insert(name, ref_value); - } - (None, None) => { - changed_properties.remove(&name); - } - } - } - - // !!!!!!!!!! UGLY HACK !!!!!!!!!! - // - // See RojoTree::insert_instance. Adjust that code also if you are touching this. - let actual_class = changed_class_name.unwrap_or(instance.class_name()); - match actual_class.as_str() { - "Model" | "Actor" | "Tool" | "HopperBin" | "Flag" | "WorldModel" | "Workspace" - | "Status" => { - let migration_prop = ustr("NeedsPivotMigration"); - // We want to just ignore this if it's being removed by a patch. - // Normally this would not matter because serving != building but - // if we start syncing models using SerializationService - // (or GetObjects) it will affect how Studio deserializes things. - if !instance.properties().contains_key(&migration_prop) { - changed_properties.insert(migration_prop, Some(Variant::Bool(false))); - } - match changed_properties.get(&migration_prop) { - Some(Some(Variant::Bool(_))) => {} - Some(None) => { - changed_properties.remove(&migration_prop); - } - _ => { - changed_properties.insert(migration_prop, Some(Variant::Bool(false))); - } - } - } - _ => {} - }; - if changed_properties.is_empty() && changed_name.is_none() && changed_class_name.is_none() @@ -210,7 +148,7 @@ fn compute_property_patches( fn compute_children_patches( context: &mut ComputePatchContext, - snapshot: &mut InstanceSnapshot, + snapshot: &InstanceSnapshot, tree: &RojoTree, id: Ref, patch_set: &mut PatchSet, @@ -223,7 +161,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 +198,7 @@ fn compute_children_patches( None => { patch_set.added_instances.push(PatchAdd { parent_id: id, - instance: snapshot_child, + instance: snapshot_child.clone(), }); } } @@ -275,58 +213,14 @@ fn compute_children_patches( } } -fn compute_ref_properties( - snapshot: &InstanceSnapshot, - tree: &RojoTree, -) -> UstrMap> { - let mut map = UstrMap::new(); - let attributes = match snapshot.properties.get(&ustr("Attributes")) { - Some(Variant::Attributes(attrs)) => attrs, - _ => return map, - }; - - for (attr_name, attr_value) in attributes.iter() { - let prop_name = match attr_name.strip_prefix(REF_POINTER_ATTRIBUTE_PREFIX) { - Some(str) => str, - None => continue, - }; - let rojo_ref = match attr_value { - Variant::String(str) => RojoRef::new(str.clone()), - Variant::BinaryString(bytes) => { - if let Ok(str) = std::str::from_utf8(bytes.as_ref()) { - RojoRef::new(str.to_string()) - } else { - log::warn!( - "IDs specified by referent property attributes must be valid UTF-8 strings" - ); - continue; - } - } - _ => { - log::warn!( - "Attribute {attr_name} is of type {:?} when it was \ - expected to be a String", - attr_value.ty() - ); - continue; - } - }; - if let Some(target_id) = tree.get_specified_id(&rojo_ref) { - map.insert(ustr(prop_name), Some(Variant::Ref(target_id))); - } else { - map.insert(ustr(prop_name), None); - } - } - - map -} - #[cfg(test)] mod test { use super::*; use std::borrow::Cow; + use maplit::hashmap; + /// This test makes sure that rewriting refs in instance update patches to /// instances that already exists works. We should be able to correlate the /// snapshot ID and instance ID during patch computation and replace the @@ -341,26 +235,27 @@ mod test { // addition of a prop named Self, which is a self-referential Ref. let snapshot_id = Ref::new(); let snapshot = InstanceSnapshot { - snapshot_id, - properties: UstrMap::from_iter([(ustr("Self"), Variant::Ref(snapshot_id))]), + snapshot_id: Some(snapshot_id), + properties: hashmap! { + "Self".to_owned() => Variant::Ref(snapshot_id), + }, metadata: Default::default(), name: Cow::Borrowed("foo"), - class_name: ustr("foo"), + class_name: Cow::Borrowed("foo"), children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, root_id); + let patch_set = compute_patch_set(&snapshot, &tree, root_id); let expected_patch_set = PatchSet { updated_instances: vec![PatchUpdate { id: root_id, changed_name: None, changed_class_name: None, - changed_properties: UstrMap::from_iter([( - ustr("Self"), - Some(Variant::Ref(root_id)), - )]), + changed_properties: hashmap! { + "Self".to_owned() => Some(Variant::Ref(root_id)), + }, changed_metadata: None, }], added_instances: Vec::new(), @@ -382,34 +277,38 @@ mod test { // This patch describes the existing instance with a new child added. let snapshot_id = Ref::new(); let snapshot = InstanceSnapshot { - snapshot_id, + snapshot_id: Some(snapshot_id), children: vec![InstanceSnapshot { - properties: UstrMap::from_iter([(ustr("Self"), Variant::Ref(snapshot_id))]), + properties: hashmap! { + "Self".to_owned() => Variant::Ref(snapshot_id), + }, - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("child"), - class_name: ustr("child"), + class_name: Cow::Borrowed("child"), children: Vec::new(), }], metadata: Default::default(), - properties: UstrMap::new(), + properties: HashMap::new(), name: Cow::Borrowed("foo"), - class_name: ustr("foo"), + class_name: Cow::Borrowed("foo"), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, root_id); + let patch_set = compute_patch_set(&snapshot, &tree, root_id); let expected_patch_set = PatchSet { added_instances: vec![PatchAdd { parent_id: root_id, instance: InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), - properties: UstrMap::from_iter([(ustr("Self"), Variant::Ref(root_id))]), + properties: hashmap! { + "Self".to_owned() => Variant::Ref(root_id), + }, name: Cow::Borrowed("child"), - class_name: ustr("child"), + class_name: Cow::Borrowed("child"), children: Vec::new(), }, }], diff --git a/src/snapshot/tests/apply.rs b/src/snapshot/tests/apply.rs index 4c3f7f38..96a365ac 100644 --- a/src/snapshot/tests/apply.rs +++ b/src/snapshot/tests/apply.rs @@ -1,6 +1,6 @@ use insta::assert_yaml_snapshot; +use maplit::hashmap; -use rbx_dom_weak::{ustr, UstrMap}; use rojo_insta_ext::RedactionMap; use crate::{ @@ -10,7 +10,7 @@ use crate::{ #[test] fn set_name_and_class_name() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); intern_tree(&tree, &mut redactions); @@ -19,7 +19,7 @@ fn set_name_and_class_name() { updated_instances: vec![PatchUpdate { id: tree.get_root_id(), changed_name: Some("Hello, world!".to_owned()), - changed_class_name: Some(ustr("Folder")), + changed_class_name: Some("Folder".to_owned()), changed_properties: Default::default(), changed_metadata: None, }], @@ -37,7 +37,7 @@ fn set_name_and_class_name() { #[test] fn add_property() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); intern_tree(&tree, &mut redactions); @@ -47,7 +47,9 @@ fn add_property() { id: tree.get_root_id(), changed_name: None, changed_class_name: None, - changed_properties: UstrMap::from_iter([(ustr("Foo"), Some("Value of Foo".into()))]), + changed_properties: hashmap! { + "Foo".to_owned() => Some("Value of Foo".into()), + }, changed_metadata: None, }], ..Default::default() @@ -64,7 +66,7 @@ fn add_property() { #[test] fn remove_property() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); intern_tree(&tree, &mut redactions); @@ -75,7 +77,7 @@ fn remove_property() { root_instance .properties_mut() - .insert(ustr("Foo"), "Should be removed".into()); + .insert("Foo".to_owned(), "Should be removed".into()); } let tree_view = view_tree(&tree, &mut redactions); @@ -86,7 +88,9 @@ fn remove_property() { id: tree.get_root_id(), changed_name: None, changed_class_name: None, - changed_properties: UstrMap::from_iter([(ustr("Foo"), None)]), + changed_properties: hashmap! { + "Foo".to_owned() => None, + }, changed_metadata: None, }], ..Default::default() diff --git a/src/snapshot/tests/compute.rs b/src/snapshot/tests/compute.rs index 2888a94d..c62978c9 100644 --- a/src/snapshot/tests/compute.rs +++ b/src/snapshot/tests/compute.rs @@ -1,29 +1,29 @@ use std::borrow::Cow; use insta::assert_yaml_snapshot; +use maplit::hashmap; -use rbx_dom_weak::{types::Ref, ustr, UstrMap}; use rojo_insta_ext::RedactionMap; use crate::snapshot::{compute_patch_set, InstanceSnapshot, RojoTree}; #[test] fn set_name_and_class_name() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let tree = empty_tree(); redactions.intern(tree.get_root_id()); let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("Some Folder"), - class_name: ustr("Folder"), + class_name: Cow::Borrowed("Folder"), properties: Default::default(), children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -31,21 +31,23 @@ fn set_name_and_class_name() { #[test] fn set_property() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let tree = empty_tree(); redactions.intern(tree.get_root_id()); let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("ROOT"), - class_name: ustr("ROOT"), - properties: UstrMap::from_iter([(ustr("PropertyName"), "Hello, world!".into())]), + class_name: Cow::Borrowed("ROOT"), + properties: hashmap! { + "PropertyName".to_owned() => "Hello, world!".into(), + }, children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -53,7 +55,7 @@ fn set_property() { #[test] fn remove_property() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); redactions.intern(tree.get_root_id()); @@ -61,21 +63,22 @@ fn remove_property() { { let root_id = tree.get_root_id(); let mut root_instance = tree.get_instance_mut(root_id).unwrap(); - root_instance - .properties_mut() - .insert(ustr("Foo"), "This should be removed by the patch.".into()); + root_instance.properties_mut().insert( + "Foo".to_owned(), + "This should be removed by the patch.".into(), + ); } let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("ROOT"), - class_name: ustr("ROOT"), + class_name: Cow::Borrowed("ROOT"), properties: Default::default(), children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -83,28 +86,28 @@ fn remove_property() { #[test] fn add_child() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let tree = empty_tree(); redactions.intern(tree.get_root_id()); let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("ROOT"), - class_name: ustr("ROOT"), + class_name: Cow::Borrowed("ROOT"), properties: Default::default(), children: vec![InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("New"), - class_name: ustr("Folder"), + class_name: Cow::Borrowed("Folder"), properties: Default::default(), children: Vec::new(), }], }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -112,7 +115,7 @@ fn add_child() { #[test] fn remove_child() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); redactions.intern(tree.get_root_id()); @@ -128,15 +131,15 @@ fn remove_child() { } let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("ROOT"), - class_name: ustr("ROOT"), + class_name: Cow::Borrowed("ROOT"), properties: Default::default(), children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); diff --git a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__add_property-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..b0f12b69 100644 --- a/src/snapshot/tree.rs +++ b/src/snapshot/tree.rs @@ -5,10 +5,10 @@ use std::{ use rbx_dom_weak::{ types::{Ref, Variant}, - ustr, Instance, InstanceBuilder, Ustr, UstrMap, WeakDom, + Instance, InstanceBuilder, WeakDom, }; -use crate::{multimap::MultiMap, RojoRef}; +use crate::multimap::MultiMap; use super::{InstanceMetadata, InstanceSnapshot}; @@ -33,25 +33,18 @@ pub struct RojoTree { /// appearing multiple times in the same Rojo project. This is sometimes /// called "path aliasing" in various Rojo documentation. path_to_ids: MultiMap, - - /// A map of specified RojoRefs to underlying Refs they represent. - /// This field is a MultiMap to allow for the possibility of the user specifying - /// the same RojoRef for multiple different instances. An entry containing - /// multiple elements is an error condition that should be raised to the user. - specified_id_to_refs: MultiMap, } impl RojoTree { pub fn new(snapshot: InstanceSnapshot) -> RojoTree { - let root_builder = InstanceBuilder::new(snapshot.class_name) - .with_name(snapshot.name) + let root_builder = InstanceBuilder::new(snapshot.class_name.to_owned()) + .with_name(snapshot.name.to_owned()) .with_properties(snapshot.properties); let mut tree = RojoTree { inner: WeakDom::new(root_builder), metadata_map: HashMap::new(), path_to_ids: MultiMap::new(), - specified_id_to_refs: MultiMap::new(), }; let root_ref = tree.inner.root_ref(); @@ -73,14 +66,7 @@ impl RojoTree { self.inner.root_ref() } - /// Returns the root Instance of this tree. - #[inline] - pub fn root(&self) -> InstanceWithMeta<'_> { - self.get_instance(self.get_root_id()) - .expect("RojoTrees should have a root") - } - - pub fn get_instance(&self, id: Ref) -> Option> { + pub fn get_instance(&self, id: Ref) -> Option { if let Some(instance) = self.inner.get_by_ref(id) { let metadata = self.metadata_map.get(&id).unwrap(); @@ -90,7 +76,7 @@ impl RojoTree { } } - pub fn get_instance_mut(&mut self, id: Ref) -> Option> { + pub fn get_instance_mut(&mut self, id: Ref) -> Option { if let Some(instance) = self.inner.get_by_ref_mut(id) { let metadata = self.metadata_map.get_mut(&id).unwrap(); @@ -101,33 +87,8 @@ impl RojoTree { } pub fn insert_instance(&mut self, parent_ref: Ref, snapshot: InstanceSnapshot) -> Ref { - // !!!!!!!!!! UGLY HACK !!!!!!!!!! - // ! If you are going to change this, go change it in patch_compute/compute_property_patches too - // - // This is a set of special cases working around a more general problem upstream - // in rbx-dom that causes pivots to not build to file correctly, described in - // github.com/rojo-rbx/rojo/issues/628 and github.com/rojo-rbx/rbx-dom/issues/385 - // - // We need to insert the NeedsPivotMigration property with a value of false on - // every instance that inherits from Model for pivots to build correctly. - let hack_needs_pivot_migration = match snapshot.class_name.as_ref() { - // This is not a future proof way to do this but the last time a - // descendant of Model was added was in 2020 so it's probably fine. - "Model" | "Actor" | "Tool" | "HopperBin" | "Flag" | "WorldModel" | "Workspace" - | "Status" - if !snapshot - .properties - .contains_key(&ustr("NeedsPivotMigration")) => - { - vec![("NeedsPivotMigration", Variant::Bool(false))] - } - _ => Vec::new(), - }; - - let builder = InstanceBuilder::empty() - .with_class(snapshot.class_name) - .with_name(snapshot.name.into_owned()) - .with_properties(hack_needs_pivot_migration) + let builder = InstanceBuilder::new(snapshot.class_name.to_owned()) + .with_name(snapshot.name.to_owned()) .with_properties(snapshot.properties); let referent = self.inner.insert(parent_ref, builder); @@ -175,20 +136,6 @@ impl RojoTree { self.path_to_ids.insert(new_path.clone(), id); } } - if existing_metadata.specified_id != metadata.specified_id { - // We need to uphold the invariant that each ID can only map - // to one referent. - if let Some(new) = &metadata.specified_id { - if !self.specified_id_to_refs.get(new).is_empty() { - log::error!("Duplicate user-specified referent '{new}'"); - } - - self.specified_id_to_refs.insert(new.clone(), id); - } - if let Some(old) = &existing_metadata.specified_id { - self.specified_id_to_refs.remove(old, id); - } - } entry.insert(metadata); } @@ -213,37 +160,11 @@ impl RojoTree { self.metadata_map.get(&id) } - /// Get the backing Ref of the given RojoRef. If the RojoRef maps to exactly - /// one Ref, this method returns Some. Otherwise, it returns None. - pub fn get_specified_id(&self, specified: &RojoRef) -> Option { - match self.specified_id_to_refs.get(specified)[..] { - [referent] => Some(referent), - _ => None, - } - } - - pub fn set_specified_id(&mut self, id: Ref, specified: RojoRef) { - if let Some(metadata) = self.metadata_map.get_mut(&id) { - if let Some(old) = metadata.specified_id.replace(specified.clone()) { - self.specified_id_to_refs.remove(&old, id); - } - } - self.specified_id_to_refs.insert(specified, id); - } - fn insert_metadata(&mut self, id: Ref, metadata: InstanceMetadata) { for path in &metadata.relevant_paths { self.path_to_ids.insert(path.clone(), id); } - if let Some(specified_id) = &metadata.specified_id { - if !self.specified_id_to_refs.get(specified_id).is_empty() { - log::error!("Duplicate user-specified referent '{specified_id}'"); - } - - self.set_specified_id(id, specified_id.clone()); - } - self.metadata_map.insert(id, metadata); } @@ -252,10 +173,6 @@ impl RojoTree { fn remove_metadata(&mut self, id: Ref) { let metadata = self.metadata_map.remove(&id).unwrap(); - if let Some(specified) = metadata.specified_id { - self.specified_id_to_refs.remove(&specified, id); - } - for path in &metadata.relevant_paths { self.path_to_ids.remove(path, id); } @@ -314,11 +231,11 @@ impl<'a> InstanceWithMeta<'a> { &self.instance.name } - pub fn class_name(&self) -> Ustr { - self.instance.class + pub fn class_name(&self) -> &'a str { + &self.instance.class } - pub fn properties(&self) -> &'a UstrMap { + pub fn properties(&self) -> &'a HashMap { &self.instance.properties } @@ -327,11 +244,7 @@ impl<'a> InstanceWithMeta<'a> { } pub fn metadata(&self) -> &'a InstanceMetadata { - self.metadata - } - - pub fn inner(&self) -> &Instance { - self.instance + &self.metadata } } @@ -363,15 +276,15 @@ impl InstanceWithMetaMut<'_> { &self.instance.class } - pub fn set_class_name<'a, S: Into<&'a str>>(&mut self, new_class: S) { - self.instance.class = ustr(new_class.into()); + pub fn class_name_mut(&mut self) -> &mut String { + &mut self.instance.class } - pub fn properties(&self) -> &UstrMap { + pub fn properties(&self) -> &HashMap { &self.instance.properties } - pub fn properties_mut(&mut self) -> &mut UstrMap { + pub fn properties_mut(&mut self) -> &mut HashMap { &mut self.instance.properties } @@ -380,41 +293,6 @@ impl InstanceWithMetaMut<'_> { } pub fn metadata(&self) -> &InstanceMetadata { - self.metadata - } - - pub fn inner(&self) -> &Instance { - self.instance - } - - pub fn inner_mut(&mut self) -> &mut Instance { - self.instance - } -} - -#[cfg(test)] -mod test { - use crate::{ - snapshot::{InstanceMetadata, InstanceSnapshot}, - RojoRef, - }; - - use super::RojoTree; - - #[test] - fn swap_duped_specified_ids() { - let custom_ref = RojoRef::new("MyCoolRef".into()); - let snapshot = InstanceSnapshot::new() - .metadata(InstanceMetadata::new().specified_id(Some(custom_ref.clone()))); - let mut tree = RojoTree::new(InstanceSnapshot::new()); - - let original = tree.insert_instance(tree.get_root_id(), snapshot.clone()); - assert_eq!(tree.get_specified_id(&custom_ref.clone()), Some(original)); - - let duped = tree.insert_instance(tree.get_root_id(), snapshot.clone()); - assert_eq!(tree.get_specified_id(&custom_ref.clone()), None); - - tree.remove(original); - assert_eq!(tree.get_specified_id(&custom_ref.clone()), Some(duped)); + &self.metadata } } diff --git a/src/snapshot_middleware/csv.rs b/src/snapshot_middleware/csv.rs index 8cea9b81..1734fc07 100644 --- a/src/snapshot_middleware/csv.rs +++ b/src/snapshot_middleware/csv.rs @@ -1,31 +1,21 @@ -use std::{ - borrow::Cow, - collections::{BTreeMap, BTreeSet}, - path::Path, -}; +use std::{collections::BTreeMap, path::Path}; use anyhow::Context; -use memofs::Vfs; -use rbx_dom_weak::{types::Variant, ustr}; -use serde::{Deserialize, Serialize}; +use maplit::hashmap; +use memofs::{IoResultExt, Vfs}; +use serde::Serialize; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; -use super::{ - dir::{snapshot_dir_no_meta, syncback_dir_no_meta}, - meta_file::{AdjacentMetadata, DirectoryMetadata}, - PathExt as _, -}; +use super::{meta_file::AdjacentMetadata, 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 +26,46 @@ 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() => table_contents.into(), + }) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]), + .relevant_paths(vec![path.to_path_buf(), meta_path.clone()]), ); - AdjacentMetadata::read_and_apply_all(vfs, path, name, &mut snapshot)?; + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = AdjacentMetadata::from_slice(&meta_contents, meta_path)?; + metadata.apply_all(&mut snapshot)?; + } Ok(Some(snapshot)) } -/// Attempts to snapshot an 'init' csv contained inside of a folder with -/// the given name. -/// -/// csv named `init.csv` -/// their parents, which acts similarly to `__init__.py` from the Python world. -pub fn snapshot_csv_init( - context: &InstanceContext, - vfs: &Vfs, - init_path: &Path, - name: &str, -) -> anyhow::Result> { - let folder_path = init_path.parent().unwrap(); - let dir_snapshot = snapshot_dir_no_meta(context, vfs, folder_path, name)?.unwrap(); - - if dir_snapshot.class_name != "Folder" { - anyhow::bail!( - "init.csv can only be used if the instance produced by \ - the containing directory would be a Folder.\n\ - \n\ - The directory {} turned into an instance of class {}.", - folder_path.display(), - dir_snapshot.class_name - ); - } - - let mut init_snapshot = snapshot_csv(context, vfs, init_path, &dir_snapshot.name)?.unwrap(); - - init_snapshot.children = dir_snapshot.children; - init_snapshot.metadata = dir_snapshot.metadata; - // The directory snapshot middleware includes all possible init paths - // so we don't need to add it here. - - DirectoryMetadata::read_and_apply_all(vfs, folder_path, &mut init_snapshot)?; - - Ok(Some(init_snapshot)) -} - -pub fn syncback_csv<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let new_inst = snapshot.new_inst(); - - let contents = - if let Some(Variant::String(content)) = new_inst.properties.get(&ustr("Contents")) { - content.as_str() - } else { - anyhow::bail!("LocalizationTables must have a `Contents` property that is a String") - }; - let mut fs_snapshot = FsSnapshot::new(); - fs_snapshot.add_file(&snapshot.path, localization_to_csv(contents)?); - - let meta = AdjacentMetadata::from_syncback_snapshot(snapshot, snapshot.path.clone())?; - if let Some(mut meta) = meta { - // LocalizationTables have relatively few properties that we care - // about, so shifting is fine. - meta.properties.shift_remove(&ustr("Contents")); - - if !meta.is_empty() { - let parent = snapshot.path.parent_err()?; - fs_snapshot.add_file( - parent.join(format!("{}.meta.json", new_inst.name)), - serde_json::to_vec_pretty(&meta).context("cannot serialize metadata")?, - ) - } - } - - Ok(SyncbackReturn { - fs_snapshot, - children: Vec::new(), - removed_children: Vec::new(), - }) -} - -pub fn syncback_csv_init<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let new_inst = snapshot.new_inst(); - - let contents = - if let Some(Variant::String(content)) = new_inst.properties.get(&ustr("Contents")) { - content.as_str() - } else { - anyhow::bail!("LocalizationTables must have a `Contents` property that is a String") - }; - - let mut dir_syncback = syncback_dir_no_meta(snapshot)?; - dir_syncback.fs_snapshot.add_file( - snapshot.path.join("init.csv"), - localization_to_csv(contents)?, - ); - - let meta = DirectoryMetadata::from_syncback_snapshot(snapshot, snapshot.path.clone())?; - if let Some(mut meta) = meta { - // LocalizationTables have relatively few properties that we care - // about, so shifting is fine. - meta.properties.shift_remove(&ustr("Contents")); - if !meta.is_empty() { - dir_syncback.fs_snapshot.add_file( - snapshot.path.join("init.meta.json"), - serde_json::to_vec_pretty(&meta) - .context("could not serialize new init.meta.json")?, - ); - } - } - - Ok(dir_syncback) -} - /// Struct that holds any valid row from a Roblox CSV translation table. /// /// We manually deserialize into this table from CSV, but let serde_json handle /// serialization. -#[derive(Debug, Default, Deserialize)] +#[derive(Debug, Default, Serialize)] #[serde(rename_all = "camelCase")] struct LocalizationEntry<'a> { - key: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + key: Option<&'a str>, - context: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + context: Option<&'a str>, - // Roblox writes `examples` for LocalizationTable's Content property, which - // causes it to not roundtrip correctly. - // This is reported here: https://devforum.roblox.com/t/2908720. - // - // To support their mistake, we support an alias named `examples`. - #[serde(alias = "examples")] - example: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + example: Option<&'a str>, - source: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + source: Option<&'a str>, // We use a BTreeMap here to get deterministic output order. - values: BTreeMap, Cow<'a, str>>, -} - -// Guarantee a specific order of both fields and entries so that diff always match up -impl<'a> Serialize for LocalizationEntry<'a> { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - let mut btree = BTreeMap::new(); - - if let Some(key) = &self.key { - btree.insert( - "key", - serde_json::to_value(key).map_err(serde::ser::Error::custom)?, - ); - } - - if let Some(context) = &self.context { - btree.insert( - "context", - serde_json::to_value(context).map_err(serde::ser::Error::custom)?, - ); - } - - if let Some(example) = &self.example { - btree.insert( - "example", - serde_json::to_value(example).map_err(serde::ser::Error::custom)?, - ); - } - - if let Some(source) = &self.source { - btree.insert( - "source", - serde_json::to_value(source).map_err(serde::ser::Error::custom)?, - ); - } - - btree.insert( - "values", - serde_json::to_value(&self.values).map_err(serde::ser::Error::custom)?, - ); - - btree.serialize(serializer) - } -} - -fn sort_localization_entries(mut entries: Vec) -> Vec { - entries.sort_by(|a, b| { - a.key - .as_deref() - .unwrap_or_default() - .cmp(&b.key.as_deref().unwrap_or_default()) - .then_with(|| { - a.source - .as_deref() - .unwrap_or_default() - .cmp(&b.source.as_deref().unwrap_or_default()) - }) - }); - - entries + values: BTreeMap<&'a str, &'a str>, } /// Normally, we'd be able to let the csv crate construct our struct for us. @@ -254,7 +77,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 +99,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 +116,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 +141,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 +173,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 +186,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..e4b47ffc 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..2e5c53fc 100644 --- a/src/snapshot_middleware/json.rs +++ b/src/snapshot_middleware/json.rs @@ -1,42 +1,50 @@ use std::path::Path; -use memofs::Vfs; -use rbx_dom_weak::ustr; +use anyhow::Context; +use maplit::hashmap; +use memofs::{IoResultExt, Vfs}; use crate::{ - json, lua_ast::{Expression, Statement}, snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, }; -use super::meta_file::AdjacentMetadata; +use super::{meta_file::AdjacentMetadata, 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() => as_lua.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("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 +101,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..b14b66b4 100644 --- a/src/snapshot_middleware/json_model.rs +++ b/src/snapshot_middleware/json_model.rs @@ -1,217 +1,90 @@ -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 serde::Deserialize; use crate::{ - json, resolution::UnresolvedValue, snapshot::{InstanceContext, InstanceSnapshot}, - syncback::{filter_properties_preallocated, FsSnapshot, SyncbackReturn, SyncbackSnapshot}, - RojoRef, }; +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()))?; - - 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 instance: JsonModel = serde_json::from_slice(&contents) + .with_context(|| format!("File is not a valid JSON model: {}", path.display()))?; let mut snapshot = instance - .into_snapshot() + .core + .into_snapshot(instance_name.to_owned()) .with_context(|| format!("Could not load JSON model: {}", path.display()))?; snapshot.metadata = snapshot .metadata .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) - .context(context) - .specified_id(id) - .schema(schema); + .relevant_paths(vec![path.to_path_buf()]) + .context(context); Ok(Some(snapshot)) } -pub fn syncback_json_model<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let mut property_buffer = Vec::with_capacity(snapshot.new_inst().properties.len()); - - let mut model = json_model_from_pair(snapshot, &mut property_buffer, snapshot.new); - // We don't need the name on the root, but we do for children. - model.name = None; - - if let Some(old_inst) = snapshot.old_inst() { - // TODO: Is it worth this being an Arc or Rc? I doubt that enough - // schemas will ever exist in one project for it to matter, but it - // could have a performance cost. - model.schema = old_inst.metadata().schema.clone(); - } - - Ok(SyncbackReturn { - fs_snapshot: FsSnapshot::new().with_added_file( - &snapshot.path, - serde_json::to_vec_pretty(&model).context("failed to serialize new JSON Model")?, - ), - children: Vec::new(), - removed_children: Vec::new(), - }) -} - -fn json_model_from_pair<'sync>( - snapshot: &SyncbackSnapshot<'sync>, - prop_buffer: &mut Vec<(Ustr, &'sync Variant)>, - new: Ref, -) -> JsonModel { - let new_inst = snapshot - .get_new_instance(new) - .expect("all new referents passed to json_model_from_pair should exist"); - - filter_properties_preallocated(snapshot.project(), new_inst, prop_buffer); - - let mut properties = IndexMap::new(); - let mut attributes = IndexMap::new(); - for (name, value) in prop_buffer.drain(..) { - match value { - Variant::Attributes(attrs) => { - for (attr_name, attr_value) in attrs.iter() { - // We (probably) don't want to preserve internal attributes, - // only user defined ones. - if attr_name.starts_with("RBX") { - continue; - } - attributes.insert( - attr_name.clone(), - UnresolvedValue::from_variant_unambiguous(attr_value.clone()), - ); - } - } - _ => { - properties.insert( - name, - UnresolvedValue::from_variant(value.clone(), &new_inst.class, &name), - ); - } - } - } - - let mut children = Vec::with_capacity(new_inst.children().len()); - - for new_child_ref in new_inst.children() { - children.push(json_model_from_pair(snapshot, prop_buffer, *new_child_ref)) - } - - JsonModel { - name: Some(new_inst.name.clone()), - class_name: new_inst.class, - children, - properties, - attributes, - id: None, - schema: None, - } -} - -#[derive(Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] struct JsonModel { - #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")] - schema: Option, - - #[serde(alias = "Name", skip_serializing_if = "Option::is_none")] name: Option, - #[serde(alias = "ClassName")] - class_name: Ustr, - - #[serde(skip_serializing_if = "Option::is_none")] - id: Option, - - #[serde( - alias = "Children", - default = "Vec::new", - skip_serializing_if = "Vec::is_empty" - )] - children: Vec, - - #[serde( - alias = "Properties", - default, - skip_serializing_if = "IndexMap::is_empty" - )] - properties: IndexMap, - - #[serde(default = "IndexMap::new", skip_serializing_if = "IndexMap::is_empty")] - attributes: IndexMap, + #[serde(flatten)] + core: JsonModelCore, } -impl JsonModel { - fn into_snapshot(self) -> anyhow::Result { - let name = self.name.unwrap_or_else(|| self.class_name.to_owned()); +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +struct JsonModelInstance { + name: String, + + #[serde(flatten)] + core: JsonModelCore, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +struct JsonModelCore { + class_name: String, + + #[serde(default = "Vec::new", skip_serializing_if = "Vec::is_empty")] + children: Vec, + + #[serde(default = "HashMap::new", skip_serializing_if = "HashMap::is_empty")] + properties: HashMap, +} + +impl JsonModelCore { + fn into_snapshot(self, name: String) -> anyhow::Result { let class_name = self.class_name; let mut children = Vec::with_capacity(self.children.len()); for child in self.children { - children.push(child.into_snapshot()?); + children.push(child.core.into_snapshot(child.name)?); } - let mut properties = UstrMap::with_capacity(self.properties.len()); + let mut properties = HashMap::with_capacity(self.properties.len()); for (key, unresolved) in self.properties { let value = unresolved.resolve(&class_name, &key)?; properties.insert(key, value); } - if !self.attributes.is_empty() { - let mut attributes = Attributes::new(); - - for (key, unresolved) in self.attributes { - let value = unresolved.resolve_unambiguous()?; - attributes.insert(key, value); - } - - properties.insert("Attributes".into(), attributes.into()); - } - Ok(InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Owned(name), - class_name, + class_name: Cow::Owned(class_name), properties, children, }) @@ -232,44 +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..cc443084 100644 --- a/src/snapshot_middleware/lua.rs +++ b/src/snapshot_middleware/lua.rs @@ -1,98 +1,55 @@ use std::{path::Path, str}; -use anyhow::Context as _; -use memofs::Vfs; -use rbx_dom_weak::{ - types::{Enum, Variant}, - ustr, HashMapExt as _, UstrMap, -}; +use anyhow::Context; +use maplit::hashmap; +use memofs::{IoResultExt, Vfs}; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; use super::{ - dir::{snapshot_dir_no_meta, syncback_dir_no_meta}, - meta_file::{AdjacentMetadata, DirectoryMetadata}, - PathExt as _, + 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() => contents_str.into(), + }) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) + .relevant_paths(vec![path.to_path_buf(), meta_path.clone()]) .context(context), ); - AdjacentMetadata::read_and_apply_all(vfs, path, name, &mut snapshot)?; + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = AdjacentMetadata::from_slice(&meta_contents, meta_path)?; + metadata.apply_all(&mut snapshot)?; + } Ok(Some(snapshot)) } @@ -106,113 +63,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 +95,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 +187,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 +214,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 +246,12 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, + &InstanceContext::default(), + &mut vfs, Path::new("/bar.server.lua"), - "bar", - ScriptType::Server, - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn runcontext_script_disabled() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("/bar.server.lua", VfsSnapshot::file("Hello there!")) - .unwrap(); - imfs.load_snapshot( - "/bar.meta.json", - VfsSnapshot::file( - r#" - { - "properties": { - "Disabled": true - } - } - "#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(false)), - &vfs, - Path::new("/bar.server.lua"), - "bar", - ScriptType::Server, ) .unwrap() .unwrap(); diff --git a/src/snapshot_middleware/meta_file.rs b/src/snapshot_middleware/meta_file.rs index 84ca9a80..2715dbbe 100644 --- a/src/snapshot_middleware/meta_file.rs +++ b/src/snapshot_middleware/meta_file.rs @@ -1,18 +1,9 @@ -use std::path::{Path, PathBuf}; +use std::{borrow::Cow, collections::HashMap, path::PathBuf}; use anyhow::{format_err, Context}; -use indexmap::IndexMap; -use memofs::{IoResultExt as _, Vfs}; -use rbx_dom_weak::{ - types::{Attributes, Variant}, - Ustr, -}; use serde::{Deserialize, Serialize}; -use crate::{ - json, resolution::UnresolvedValue, snapshot::InstanceSnapshot, syncback::SyncbackSnapshot, - RojoRef, -}; +use crate::{resolution::UnresolvedValue, snapshot::InstanceSnapshot}; /// Represents metadata in a sibling file with the same basename. /// @@ -21,59 +12,19 @@ use crate::{ #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct AdjacentMetadata { - #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")] - schema: Option, - - #[serde(skip_serializing_if = "Option::is_none")] - pub id: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub ignore_unknown_instances: Option, - #[serde(default, skip_serializing_if = "IndexMap::is_empty")] - pub properties: IndexMap, - - #[serde(default, skip_serializing_if = "IndexMap::is_empty")] - pub attributes: IndexMap, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub properties: HashMap, #[serde(skip)] pub path: PathBuf, } impl AdjacentMetadata { - /// Attempts to read a meta file for the provided path and name, and if - /// one exists applies it. - /// - /// Also inserts the potential metadata paths into the snapshot's relevant - /// paths for convenience purposes. - pub fn read_and_apply_all( - vfs: &Vfs, - path: &Path, - name: &str, - snapshot: &mut InstanceSnapshot, - ) -> anyhow::Result<()> { - let meta_path_json = path.with_file_name(format!("{name}.meta.json")); - let meta_path_jsonc = path.with_file_name(format!("{name}.meta.jsonc")); - - if let Some(meta_contents) = vfs.read(&meta_path_json).with_not_found()? { - let mut metadata = Self::from_slice(&meta_contents, meta_path_json.clone())?; - metadata.apply_all(snapshot)?; - } - - if let Some(meta_contents) = vfs.read(&meta_path_jsonc).with_not_found()? { - let mut metadata = Self::from_slice(&meta_contents, meta_path_json.clone())?; - metadata.apply_all(snapshot)?; - } - - // Rather than pushing these in the snapshot middleware, we can just do it here. - snapshot.metadata.relevant_paths.push(meta_path_json); - snapshot.metadata.relevant_paths.push(meta_path_jsonc); - - Ok(()) - } - - fn from_slice(slice: &[u8], path: PathBuf) -> anyhow::Result { - let mut meta: Self = json::from_slice_with_context(slice, || { + pub fn from_slice(slice: &[u8], path: PathBuf) -> anyhow::Result { + let mut meta: Self = serde_json::from_slice(slice).with_context(|| { format!( "File contained malformed .meta.json data: {}", path.display() @@ -84,80 +35,6 @@ impl AdjacentMetadata { Ok(meta) } - /// Constructs an `AdjacentMetadata` from the provided snapshot, assuming it - /// will be at the provided path. - pub fn from_syncback_snapshot( - snapshot: &SyncbackSnapshot, - path: PathBuf, - ) -> anyhow::Result> { - let mut properties = IndexMap::new(); - let mut attributes = IndexMap::new(); - // TODO make this more granular. - // I am breaking the cycle of bad TODOs. This is in reference to the fact - // that right now, this will just not write any metadata at all for - // project nodes, which is not always desirable. We should try to be - // smarter about it. - if let Some(old_inst) = snapshot.old_inst() { - if let Some(source) = &old_inst.metadata().instigating_source { - let source = source.path(); - if source != path { - log::debug!( - "Instigating source for Instance is mismatched so its metadata is being skipped.\nPath: {}", - path.display() - ); - return Ok(None); - } - } - } - - let ignore_unknown_instances = snapshot - .old_inst() - .map(|inst| inst.metadata().ignore_unknown_instances) - .unwrap_or_default(); - - let schema = snapshot - .old_inst() - .and_then(|inst| inst.metadata().schema.clone()); - - let class = &snapshot.new_inst().class; - for (name, value) in snapshot.get_path_filtered_properties(snapshot.new).unwrap() { - match value { - Variant::Attributes(attrs) => { - for (attr_name, attr_value) in attrs.iter() { - // We (probably) don't want to preserve internal - // attributes, only user defined ones. - if attr_name.starts_with("RBX") { - continue; - } - attributes.insert( - attr_name.clone(), - UnresolvedValue::from_variant_unambiguous(attr_value.clone()), - ); - } - } - _ => { - properties.insert( - name, - UnresolvedValue::from_variant(value.clone(), class, &name), - ); - } - } - } - - Ok(Some(Self { - ignore_unknown_instances: if ignore_unknown_instances { - Some(true) - } else { - None - }, - properties, - attributes, - path, - id: None, - schema, - })) - } - pub fn apply_ignore_unknown_instances(&mut self, snapshot: &mut InstanceSnapshot) { if let Some(ignore) = self.ignore_unknown_instances.take() { snapshot.metadata.ignore_unknown_instances = ignore; @@ -167,10 +44,7 @@ impl AdjacentMetadata { pub fn apply_properties(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { let path = &self.path; - // BTreeMaps don't have an equivalent to HashMap::drain, so the next - // best option is to take ownership of the entire map. Not free, but - // very cheap. - for (key, unresolved) in std::mem::take(&mut self.properties) { + for (key, unresolved) in self.properties.drain() { let value = unresolved .resolve(&snapshot.class_name, &key) .with_context(|| format!("error applying meta file {}", path.display()))?; @@ -178,61 +52,15 @@ impl AdjacentMetadata { snapshot.properties.insert(key, value); } - if !self.attributes.is_empty() { - let mut attributes = Attributes::new(); - - for (key, unresolved) in std::mem::take(&mut self.attributes) { - let value = unresolved.resolve_unambiguous()?; - attributes.insert(key, value); - } - - snapshot - .properties - .insert("Attributes".into(), attributes.into()); - } - - Ok(()) - } - - fn apply_id(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - if self.id.is_some() && snapshot.metadata.specified_id.is_some() { - anyhow::bail!( - "cannot specify an ID using {} (instance has an ID from somewhere else)", - self.path.display() - ); - } - snapshot.metadata.specified_id = self.id.take().map(RojoRef::new); - Ok(()) - } - - fn apply_schema(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - if self.schema.is_some() && snapshot.metadata.schema.is_some() { - anyhow::bail!("cannot specify a schema using {} (instance has a schema from somewhere else. how did we get here?)", self.path.display()); - } - snapshot.metadata.schema = self.schema.take(); Ok(()) } pub fn apply_all(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { self.apply_ignore_unknown_instances(snapshot); self.apply_properties(snapshot)?; - self.apply_id(snapshot)?; - self.apply_schema(snapshot)?; Ok(()) } - /// Returns whether the metadata is 'empty', meaning it doesn't have anything - /// worth persisting in it. Specifically: - /// - /// - The number of properties and attributes is 0 - /// - `ignore_unknown_instances` is None - #[inline] - pub fn is_empty(&self) -> bool { - self.attributes.is_empty() - && self.properties.is_empty() - && self.ignore_unknown_instances.is_none() - } - // TODO: Add method to allow selectively applying parts of metadata and // throwing errors if invalid parts are specified. } @@ -244,61 +72,22 @@ impl AdjacentMetadata { #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct DirectoryMetadata { - #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")] - schema: Option, - - #[serde(skip_serializing_if = "Option::is_none")] - pub id: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub ignore_unknown_instances: Option, - #[serde(default, skip_serializing_if = "IndexMap::is_empty")] - pub properties: IndexMap, - - #[serde(default, skip_serializing_if = "IndexMap::is_empty")] - pub attributes: IndexMap, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub properties: HashMap, #[serde(skip_serializing_if = "Option::is_none")] - pub class_name: Option, + pub class_name: Option, #[serde(skip)] pub path: PathBuf, } impl DirectoryMetadata { - /// Attempts to read an `init.meta`` file for the provided path, and if - /// one exists applies it. - /// - /// Also inserts the potential metadata paths into the snapshot's relevant - /// paths for convenience purposes. - pub fn read_and_apply_all( - vfs: &Vfs, - path: &Path, - snapshot: &mut InstanceSnapshot, - ) -> anyhow::Result<()> { - let meta_path_json = path.join("init.meta.json"); - let meta_path_jsonc = path.join("init.meta.jsonc"); - - if let Some(meta_contents) = vfs.read(&meta_path_json).with_not_found()? { - let mut metadata = Self::from_slice(&meta_contents, meta_path_json.clone())?; - metadata.apply_all(snapshot)?; - } - - if let Some(meta_contents) = vfs.read(&meta_path_jsonc).with_not_found()? { - let mut metadata = Self::from_slice(&meta_contents, meta_path_jsonc.clone())?; - metadata.apply_all(snapshot)?; - } - - // Rather than pushing these in the snapshot middleware, we can just do it here. - snapshot.metadata.relevant_paths.push(meta_path_json); - snapshot.metadata.relevant_paths.push(meta_path_jsonc); - - Ok(()) - } - - fn from_slice(slice: &[u8], path: PathBuf) -> anyhow::Result { - let mut meta: Self = json::from_slice_with_context(slice, || { + pub fn from_slice(slice: &[u8], path: PathBuf) -> anyhow::Result { + let mut meta: Self = serde_json::from_slice(slice).with_context(|| { format!( "File contained malformed init.meta.json data: {}", path.display() @@ -309,90 +98,10 @@ impl DirectoryMetadata { Ok(meta) } - /// Constructs a `DirectoryMetadata` from the provided snapshot, assuming it - /// will be at the provided path. - /// - /// This function does not set `ClassName` manually as most uses won't - /// want it set. - pub fn from_syncback_snapshot( - snapshot: &SyncbackSnapshot, - path: PathBuf, - ) -> anyhow::Result> { - let mut properties = IndexMap::new(); - let mut attributes = IndexMap::new(); - // TODO make this more granular. - // I am breaking the cycle of bad TODOs. This is in reference to the fact - // that right now, this will just not write any metadata at all for - // project nodes, which is not always desirable. We should try to be - // smarter about it. - if let Some(old_inst) = snapshot.old_inst() { - if let Some(source) = &old_inst.metadata().instigating_source { - let source = source.path(); - if source != path { - log::debug!( - "Instigating source for Instance is mismatched so its metadata is being skipped.\nPath: {}", - path.display() - ); - return Ok(None); - } - } - } - - let ignore_unknown_instances = snapshot - .old_inst() - .map(|inst| inst.metadata().ignore_unknown_instances) - .unwrap_or_default(); - - let schema = snapshot - .old_inst() - .and_then(|inst| inst.metadata().schema.clone()); - - let class = &snapshot.new_inst().class; - for (name, value) in snapshot.get_path_filtered_properties(snapshot.new).unwrap() { - match value { - Variant::Attributes(attrs) => { - for (name, value) in attrs.iter() { - // We (probably) don't want to preserve internal - // attributes, only user defined ones. - if name.starts_with("RBX") { - continue; - } - attributes.insert( - name.to_owned(), - UnresolvedValue::from_variant_unambiguous(value.clone()), - ); - } - } - _ => { - properties.insert( - name, - UnresolvedValue::from_variant(value.clone(), class, &name), - ); - } - } - } - - Ok(Some(Self { - ignore_unknown_instances: if ignore_unknown_instances { - Some(true) - } else { - None - }, - properties, - attributes, - class_name: None, - path, - id: None, - schema, - })) - } - pub fn apply_all(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { self.apply_ignore_unknown_instances(snapshot); self.apply_class_name(snapshot)?; self.apply_properties(snapshot)?; - self.apply_id(snapshot)?; - self.apply_schema(snapshot)?; Ok(()) } @@ -407,7 +116,7 @@ impl DirectoryMetadata { )); } - snapshot.class_name = class_name; + snapshot.class_name = Cow::Owned(class_name); } Ok(()) @@ -422,7 +131,7 @@ impl DirectoryMetadata { fn apply_properties(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { let path = &self.path; - for (key, unresolved) in std::mem::take(&mut self.properties) { + for (key, unresolved) in self.properties.drain() { let value = unresolved .resolve(&snapshot.class_name, &key) .with_context(|| format!("error applying meta file {}", path.display()))?; @@ -430,163 +139,6 @@ impl DirectoryMetadata { snapshot.properties.insert(key, value); } - if !self.attributes.is_empty() { - let mut attributes = Attributes::new(); - - for (key, unresolved) in std::mem::take(&mut self.attributes) { - let value = unresolved.resolve_unambiguous()?; - attributes.insert(key, value); - } - - snapshot - .properties - .insert("Attributes".into(), attributes.into()); - } - Ok(()) } - - fn apply_id(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - if self.id.is_some() && snapshot.metadata.specified_id.is_some() { - anyhow::bail!( - "cannot specify an ID using {} (instance has an ID from somewhere else)", - self.path.display() - ); - } - snapshot.metadata.specified_id = self.id.take().map(RojoRef::new); - Ok(()) - } - - fn apply_schema(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - if self.schema.is_some() && snapshot.metadata.schema.is_some() { - anyhow::bail!("cannot specify a schema using {} (instance has a schema from somewhere else. how did we get here?)", self.path.display()); - } - snapshot.metadata.schema = self.schema.take(); - Ok(()) - } - /// Returns whether the metadata is 'empty', meaning it doesn't have anything - /// worth persisting in it. Specifically: - /// - /// - The number of properties and attributes is 0 - /// - `ignore_unknown_instances` is None - /// - `class_name` is either None or not Some("Folder") - #[inline] - pub fn is_empty(&self) -> bool { - self.attributes.is_empty() - && self.properties.is_empty() - && self.ignore_unknown_instances.is_none() - && if let Some(class) = &self.class_name { - class == "Folder" - } else { - true - } - } -} - -/// Retrieves the meta file that should be applied for the provided directory, -/// if it exists. -pub fn dir_meta(vfs: &Vfs, path: &Path) -> anyhow::Result> { - let meta_path = path.join("init.meta.json"); - - if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { - let metadata = DirectoryMetadata::from_slice(&meta_contents, meta_path)?; - Ok(Some(metadata)) - } else { - Ok(None) - } -} - -/// Retrieves the meta file that should be applied for the provided file, -/// if it exists. -/// -/// The `name` field should be the name the metadata should have. -pub fn file_meta(vfs: &Vfs, path: &Path, name: &str) -> anyhow::Result> { - let mut meta_path = path.with_file_name(name); - meta_path.set_extension("meta.json"); - - if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { - let metadata = AdjacentMetadata::from_slice(&meta_contents, meta_path)?; - Ok(Some(metadata)) - } else { - Ok(None) - } -} - -#[cfg(test)] -mod test { - use memofs::{InMemoryFs, VfsSnapshot}; - - use super::*; - - #[test] - fn adjacent_read_json() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo/bar.meta.json", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - let path = Path::new("/foo/bar.rojo"); - let mut snapshot = InstanceSnapshot::new(); - - AdjacentMetadata::read_and_apply_all(&vfs, path, "bar", &mut snapshot).unwrap(); - - insta::assert_yaml_snapshot!(snapshot); - } - - #[test] - fn adjacent_read_jsonc() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo/bar.meta.jsonc", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - let path = Path::new("/foo/bar.rojo"); - let mut snapshot = InstanceSnapshot::new(); - - AdjacentMetadata::read_and_apply_all(&vfs, path, "bar", &mut snapshot).unwrap(); - - insta::assert_yaml_snapshot!(snapshot); - } - - #[test] - fn directory_read_json() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo/init.meta.json", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - let path = Path::new("/foo/"); - let mut snapshot = InstanceSnapshot::new(); - - DirectoryMetadata::read_and_apply_all(&vfs, path, &mut snapshot).unwrap(); - - insta::assert_yaml_snapshot!(snapshot); - } - - #[test] - fn directory_read_jsonc() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo/init.meta.jsonc", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - let path = Path::new("/foo/"); - let mut snapshot = InstanceSnapshot::new(); - - DirectoryMetadata::read_and_apply_all(&vfs, path, &mut snapshot).unwrap(); - - insta::assert_yaml_snapshot!(snapshot); - } } diff --git a/src/snapshot_middleware/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..1c88e4b9 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 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 = rbx_reflection_database::get().classes.get(&name)?; + + if descriptor.tags.contains(&ClassTag::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( @@ -242,38 +182,7 @@ pub fn snapshot_project_node( ) })?; - 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(), value); } // If the user specified $ignoreUnknownInstances, overwrite the existing @@ -290,19 +199,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 +216,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 +232,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 +262,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 +303,8 @@ mod test { "$className": "StringValue", "$properties": { "Value": { - "String": "Hello, world!" + "Type": "String", + "Value": "Hello, world!" } } } @@ -811,13 +314,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 +350,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 +387,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 +407,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 +441,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 +482,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 +502,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 +530,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 +541,8 @@ mod test { } } } - "#, - ), - ), - ( - "other.project.json", - VfsSnapshot::file( - r#" + "#), + "other.project.json" => VfsSnapshot::file(r#" { "name": "other-project", "tree": { @@ -1088,56 +552,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..6e632328 100644 --- a/src/snapshot_middleware/rbxm.rs +++ b/src/snapshot_middleware/rbxm.rs @@ -3,63 +3,42 @@ use std::path::Path; use anyhow::Context; use memofs::Vfs; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; + +use super::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 temp_tree = rbx_binary::from_reader_default(vfs.read(path)?.as_slice()) .with_context(|| format!("Malformed rbxm file: {}", path.display()))?; let root_instance = temp_tree.root(); let children = root_instance.children(); if children.len() == 1 { - let child = children[0]; - let snapshot = InstanceSnapshot::from_tree(temp_tree, child) - .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 +54,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..37ffbe78 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(); 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..a00fa612 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: Int64 + 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..4cbf0c3d 100644 --- a/src/snapshot_middleware/txt.rs +++ b/src/snapshot_middleware/txt.rs @@ -1,75 +1,47 @@ use std::{path::Path, str}; -use anyhow::Context as _; -use memofs::Vfs; -use rbx_dom_weak::types::Variant; -use rbx_dom_weak::ustr; +use anyhow::Context; +use maplit::hashmap; +use memofs::{IoResultExt, Vfs}; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; -use super::{meta_file::AdjacentMetadata, PathExt as _}; +use super::{meta_file::AdjacentMetadata, 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() => contents_str.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("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 +56,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..db0624d4 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::types::{Ref, Variant}; use rojo_insta_ext::RedactionMap; use serde::Serialize; @@ -35,8 +31,8 @@ pub fn intern_tree(tree: &RojoTree, redactions: &mut RedactionMap) { struct InstanceView { id: Ref, name: String, - class_name: Ustr, - properties: UstrMap, + class_name: String, + properties: HashMap, metadata: InstanceMetadata, children: Vec, } @@ -47,7 +43,7 @@ fn extract_instance_view(tree: &RojoTree, id: Ref) -> InstanceView { InstanceView { id: instance.id(), name: instance.name().to_owned(), - class_name: instance.class_name(), + class_name: instance.class_name().to_owned(), properties: instance.properties().clone(), metadata: instance.metadata().clone(), children: instance diff --git a/src/variant_eq.rs b/src/variant_eq.rs deleted file mode 100644 index ae3ca20d..00000000 --- a/src/variant_eq.rs +++ /dev/null @@ -1,192 +0,0 @@ -use rbx_dom_weak::types::{PhysicalProperties, Variant, Vector3}; - -/// Accepts three argumets: a float type and two values to compare. -/// -/// Returns a bool indicating whether they're equal. This accounts for NaN such -/// that `approx_eq!(f32, f32::NAN, f32::NAN)` is `true`. -macro_rules! approx_eq { - ($Ty:ty, $a:expr, $b:expr) => { - float_cmp::approx_eq!($Ty, $a, $b) || $a.is_nan() && $b.is_nan() - }; -} - -/// Compares two variants to determine if they're equal. This correctly takes -/// float comparisons into account. -pub fn variant_eq(variant_a: &Variant, variant_b: &Variant) -> bool { - if variant_a.ty() != variant_b.ty() { - return false; - } - - match (variant_a, variant_b) { - (Variant::Attributes(a), Variant::Attributes(b)) => { - // If they're not the same size, we can just abort - if a.len() != b.len() { - return false; - } - - // Since Attributes are stored with a BTreeMap, the keys are sorted - // and we can compare each map's keys in order. - for ((a_name, a_value), (b_name, b_value)) in a.iter().zip(b.iter()) { - if !(a_name == b_name && variant_eq(a_value, b_value)) { - return false; - } - } - - true - } - (Variant::Axes(a), Variant::Axes(b)) => a == b, - (Variant::BinaryString(a), Variant::BinaryString(b)) => a == b, - (Variant::Bool(a), Variant::Bool(b)) => a == b, - (Variant::BrickColor(a), Variant::BrickColor(b)) => a == b, - (Variant::CFrame(a), Variant::CFrame(b)) => { - vector_eq(&a.position, &b.position) - && vector_eq(&a.orientation.x, &b.orientation.x) - && vector_eq(&a.orientation.y, &b.orientation.y) - && vector_eq(&a.orientation.z, &b.orientation.z) - } - (Variant::Color3(a), Variant::Color3(b)) => { - approx_eq!(f32, a.r, b.r) && approx_eq!(f32, a.g, b.g) && approx_eq!(f32, a.b, b.b) - } - (Variant::Color3uint8(a), Variant::Color3uint8(b)) => a == b, - (Variant::ColorSequence(a), Variant::ColorSequence(b)) => { - if a.keypoints.len() != b.keypoints.len() { - return false; - } - let mut a_keypoints: Vec<_> = a.keypoints.iter().collect(); - let mut b_keypoints: Vec<_> = b.keypoints.iter().collect(); - a_keypoints.sort_unstable_by(|k1, k2| k1.time.partial_cmp(&k2.time).unwrap()); - b_keypoints.sort_unstable_by(|k1, k2| k1.time.partial_cmp(&k2.time).unwrap()); - - for (a_kp, b_kp) in a_keypoints.iter().zip(b_keypoints) { - if !(approx_eq!(f32, a_kp.time, b_kp.time) - && approx_eq!(f32, a_kp.color.r, b_kp.color.r) - && approx_eq!(f32, a_kp.color.g, b_kp.color.g) - && approx_eq!(f32, a_kp.color.b, b_kp.color.b)) - { - return false; - } - } - true - } - (Variant::Content(a), Variant::Content(b)) => a == b, - (Variant::ContentId(a), Variant::ContentId(b)) => a == b, - (Variant::Enum(a), Variant::Enum(b)) => a == b, - (Variant::EnumItem(a), Variant::EnumItem(b)) => a == b, - (Variant::Faces(a), Variant::Faces(b)) => a == b, - (Variant::Float32(a), Variant::Float32(b)) => approx_eq!(f32, *a, *b), - (Variant::Float64(a), Variant::Float64(b)) => approx_eq!(f64, *a, *b), - (Variant::Font(a), Variant::Font(b)) => { - a.weight == b.weight - && a.style == b.style - && a.family == b.family - && a.cached_face_id == b.cached_face_id - } - (Variant::Int32(a), Variant::Int32(b)) => a == b, - (Variant::Int64(a), Variant::Int64(b)) => a == b, - (Variant::MaterialColors(a), Variant::MaterialColors(b)) => a.encode() == b.encode(), - (Variant::NetAssetRef(a), Variant::NetAssetRef(b)) => a == b, - (Variant::NumberRange(a), Variant::NumberRange(b)) => { - approx_eq!(f32, a.max, b.max) && approx_eq!(f32, a.min, b.min) - } - (Variant::NumberSequence(a), Variant::NumberSequence(b)) => { - if a.keypoints.len() != b.keypoints.len() { - return false; - } - let mut a_keypoints: Vec<_> = a.keypoints.iter().collect(); - let mut b_keypoints: Vec<_> = b.keypoints.iter().collect(); - a_keypoints.sort_unstable_by(|k1, k2| k1.time.partial_cmp(&k2.time).unwrap()); - b_keypoints.sort_unstable_by(|k1, k2| k1.time.partial_cmp(&k2.time).unwrap()); - - for (a_kp, b_kp) in a_keypoints.iter().zip(b_keypoints) { - if !(approx_eq!(f32, a_kp.time, b_kp.time) - && approx_eq!(f32, a_kp.value, b_kp.value) - && approx_eq!(f32, a_kp.envelope, b_kp.envelope)) - { - return false; - } - } - true - } - (Variant::OptionalCFrame(a), Variant::OptionalCFrame(b)) => match (a, b) { - (Some(a), Some(b)) => { - vector_eq(&a.position, &b.position) - && vector_eq(&a.orientation.x, &b.orientation.x) - && vector_eq(&a.orientation.y, &b.orientation.y) - && vector_eq(&a.orientation.z, &b.orientation.z) - } - (None, None) => true, - _ => false, - }, - (Variant::PhysicalProperties(a), Variant::PhysicalProperties(b)) => match (a, b) { - (PhysicalProperties::Default, PhysicalProperties::Default) => true, - (PhysicalProperties::Custom(a2), PhysicalProperties::Custom(b2)) => { - approx_eq!(f32, a2.density(), b2.density()) - && approx_eq!(f32, a2.elasticity(), b2.elasticity()) - && approx_eq!(f32, a2.friction(), b2.friction()) - && approx_eq!(f32, a2.elasticity_weight(), b2.elasticity_weight()) - && approx_eq!(f32, a2.friction_weight(), b2.friction_weight()) - && approx_eq!(f32, a2.acoustic_absorption(), b2.acoustic_absorption()) - } - _ => false, - }, - (Variant::Ray(a), Variant::Ray(b)) => { - vector_eq(&a.direction, &b.direction) && vector_eq(&a.origin, &b.origin) - } - (Variant::Rect(a), Variant::Rect(b)) => { - approx_eq!(f32, a.max.x, b.max.x) - && approx_eq!(f32, a.max.y, b.max.y) - && approx_eq!(f32, a.min.x, b.min.x) - && approx_eq!(f32, a.min.y, b.min.y) - } - (Variant::Ref(a), Variant::Ref(b)) => a == b, - (Variant::Region3(a), Variant::Region3(b)) => { - vector_eq(&a.max, &b.max) && vector_eq(&a.min, &b.min) - } - (Variant::Region3int16(a), Variant::Region3int16(b)) => a == b, - (Variant::SecurityCapabilities(a), Variant::SecurityCapabilities(b)) => a == b, - (Variant::SharedString(a), Variant::SharedString(b)) => a == b, - (Variant::Tags(a), Variant::Tags(b)) => { - let mut a_sorted: Vec<&str> = a.iter().collect(); - let mut b_sorted: Vec<&str> = b.iter().collect(); - if a_sorted.len() == b_sorted.len() { - a_sorted.sort_unstable(); - b_sorted.sort_unstable(); - for (a_tag, b_tag) in a_sorted.into_iter().zip(b_sorted) { - if a_tag != b_tag { - return false; - } - } - true - } else { - false - } - } - (Variant::UDim(a), Variant::UDim(b)) => { - approx_eq!(f32, a.scale, b.scale) && a.offset == b.offset - } - (Variant::UDim2(a), Variant::UDim2(b)) => { - approx_eq!(f32, a.x.scale, b.x.scale) - && a.x.offset == b.x.offset - && approx_eq!(f32, a.y.scale, b.y.scale) - && a.y.offset == b.y.offset - } - (Variant::UniqueId(a), Variant::UniqueId(b)) => a == b, - (Variant::String(a), Variant::String(b)) => a == b, - (Variant::Vector2(a), Variant::Vector2(b)) => { - approx_eq!(f32, a.x, b.x) && approx_eq!(f32, a.y, b.y) - } - (Variant::Vector2int16(a), Variant::Vector2int16(b)) => a == b, - (Variant::Vector3(a), Variant::Vector3(b)) => vector_eq(a, b), - (Variant::Vector3int16(a), Variant::Vector3int16(b)) => a == b, - (a, b) => panic!( - "unsupport variant comparison: {:?} and {:?}", - a.ty(), - b.ty() - ), - } -} - -#[inline(always)] -fn vector_eq(a: &Vector3, b: &Vector3) -> bool { - approx_eq!(f32, a.x, b.x) && approx_eq!(f32, a.y, b.y) && approx_eq!(f32, a.z, b.z) -} diff --git a/src/web/api.rs b/src/web/api.rs index 4fd21c0a..6a41f2e5 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, str::FromStr, sync::Arc}; -use futures::{sink::SinkExt, stream::StreamExt}; -use hyper::{body, Body, Method, Request, Response, StatusCode}; -use hyper_tungstenite::{is_upgrade_request, tungstenite::Message, upgrade, HyperWebsocket}; -use opener::OpenError; -use rbx_dom_weak::{ - types::{Ref, Variant}, - InstanceBuilder, UstrMap, WeakDom, -}; +use futures::{Future, Stream}; + +use hyper::{service::Service, Body, Method, Request, StatusCode}; +use rbx_dom_weak::types::Ref; use crate::{ serve_session::ServeSession, snapshot::{InstanceWithMeta, PatchSet, PatchUpdate}, web::{ interface::{ - ErrorResponse, Instance, MessagesPacket, OpenResponse, ReadResponse, - ServerInfoResponse, SocketPacket, SocketPacketBody, SocketPacketType, SubscribeMessage, + 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 = match requested_ids { Ok(ids) => ids, Err(_) => { - return msgpack( + 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( + 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..df4ba9ae 100644 --- a/src/web/interface.rs +++ b/src/web/interface.rs @@ -1,31 +1,23 @@ -//! 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::types::{Ref, Variant}; 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 = 4; /// Message returned by Rojo API when a change has occurred. #[derive(Debug, Serialize, Deserialize)] @@ -36,64 +28,17 @@ pub struct SubscribeMessage<'a> { 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 changed_name: Option, - pub changed_class_name: Option, + pub changed_class_name: Option, - // TODO: Transform from UstrMap> to something else, since + // TODO: Transform from HashMap> to something else, since // null will get lost when decoding from JSON in some languages. #[serde(default)] - pub changed_properties: UstrMap>, + pub changed_properties: HashMap>, pub changed_metadata: Option, } @@ -117,26 +62,32 @@ pub struct Instance<'a> { pub id: Ref, pub parent: Ref, pub name: Cow<'a, str>, - pub class_name: Ustr, - pub properties: UstrMap>, + pub class_name: Cow<'a, str>, + pub properties: HashMap>, pub children: Cow<'a, [Ref]>, pub metadata: Option, } -impl Instance<'_> { +impl<'a> Instance<'a> { pub(crate) fn from_rojo_instance(source: InstanceWithMeta<'_>) -> Instance<'_> { let properties = source .properties() .iter() - .filter(|(_key, value)| property_filter(Some(value))) - .map(|(key, value)| (*key, Cow::Borrowed(value))) + .filter_map(|(key, value)| { + // SharedString values can't be serialized via Serde + if matches!(value, Variant::SharedString(_)) { + return None; + } + + Some((key.clone(), Cow::Borrowed(value))) + }) .collect(); Instance { id: source.id(), parent: source.parent(), name: Cow::Borrowed(source.name()), - class_name: source.class_name(), + class_name: Cow::Borrowed(source.class_name()), properties, children: Cow::Borrowed(source.children()), metadata: Some(InstanceMetadata::from_rojo_metadata(source.metadata())), @@ -144,14 +95,6 @@ impl Instance<'_> { } } -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,9 +104,6 @@ pub struct ServerInfoResponse { pub protocol_version: u64, pub project_name: String, pub expected_place_ids: Option>, - pub unexpected_place_ids: Option>, - pub game_id: Option, - pub place_id: Option, pub root_instance_id: Ref, } @@ -193,44 +133,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 +149,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 +172,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 +184,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..7cc58d77 100644 --- a/src/web/ui.rs +++ b/src/web/ui.rs @@ -1,12 +1,10 @@ -//! 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 futures::{future, Future}; +use hyper::{header, service::Service, Body, Method, Request, Response, StatusCode}; +use maplit::hashmap; use rbx_dom_weak::types::{Ref, Variant}; use ritz::{html, Fragment, HtmlContent, HtmlSelfClosingTag}; @@ -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,11 +87,10 @@ impl UiService { { Self::instance(&tree, root_id) } }); - response( - StatusCode::OK, - "text/html", - format!("{}", page), - ) + Response::builder() + .header(header::CONTENT_TYPE, "text/html") + .body(Body::from(format!("{}", page))) + .unwrap() } fn instance(tree: &RojoTree, id: Ref) -> HtmlContent<'_> { @@ -115,7 +126,7 @@ impl UiService { .map(|(key, value)| { html! {

- { key.as_str() } ": " { format!("{:?}", value.ty()) } + { key.clone() } ": " { format!("{:?}", value.ty()) }
} }) @@ -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! {
-